Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > SendMessage и все все все


Автор: gonzales 26.4.2006, 23:40
Хочу посылать системные сообщения окну, хэндл которого знаю из текстовой строки, но SendMessage требует Cardinal???
Как быть???

Должно быть так, хочу закрыть приложение - пишу в Edit  WM_SYSCOMMAND, SC_CLOSE, должен получать 
postmessage(hBhWnd, WM_SYSCOMMAND, SC_CLOSE, 0);

как перевести 'WM_SYSCOMMAND' в WM_SYSCOMMAND или 'WM_SYSCOMMAND' в 274

RegisterWindowMessage не канает или я не умею им пользоваться

 

Автор: Fin 26.4.2006, 23:47
Я так понял, ты хочеш в Run-Taim режиме посылать сообшения другим окнам. Тебе придется делать свой интерпретатор сообшений. Т.е. пользователь написал название сообшения. Ты по своим таблицам находиш номер сообшения соответствуюший данной строке и посылаеш его. А еше проше сделать ComboBox Туда забить все сообшения. Пользователь выбирает онное. И ты уже конвертируеш номер итема в номер сообшения. 

Автор: gonzales 26.4.2006, 23:51
Цитата

 так понял, ты хочеш в Run-Taim режиме посылать сообшения другим окнам

это ты самую суть ухватил

Цитата

Т.е. пользователь написал название сообшения. Ты по своим таблицам находиш номер сообшения соответствуюший данной строке и посылаеш его.

 
А вот с этим проблема, ведь я же не могу охватить все программы с системными сообщениями, опять же есть WM_USER+...

А неужели нет уже готовых функций интерпретирования? 

Автор: Fin 27.4.2006, 00:05
На WM_USER+... 100 процентов уверен, что нет никакой функции. Так как эти сообшения каждый программист вправе интерпретировать сам, как захочет. Список всех стандартных сообшений есть в юните, помоему с именем Messages. Могу и ошибаться. С Дельфи давно не работал.  

Автор: gonzales 27.4.2006, 00:09
Цитата

На WM_USER+... 100 процентов уверен, что нет никакой функции


про это не допонял, например из SDK одного приложения WM_USER+201;    // Переключить на канал с абсолютным порядковым номером (LParam = 1..999)

Про стандартные функции понятно, их можно выдрать, но не хочется жестко привязываться, хочется гибкости, чтоб пользователя не ограничивать. 

Автор: Fin 27.4.2006, 00:31
Цитата

про это не допонял, например из SDK одного приложения WM_USER+201;    // Переключить на канал с абсолютным порядковым номером (LParam = 1..999)

Это конкретная привязка на конкретное приложение. Я могу например данным сообшением WM_USER+201 уведомлять свое окно, что ему нужно отключить кнопку "Запуск" и никто мне этого не может запретить. Если ты настраиваеш свою прогу на конкретное приложение, то заставлять юзера печатать сообшение WM_USER+201 не самое романтичное занятие. Лучше уж сделать кнопочку, которое это сообшение будет слать окну.
Стандартные сообшения уже привязаны к номерам и к действиям. С ними в этом отношении легче. 

Автор: Демо 27.4.2006, 08:26
>Автор
Для используемых системой сообщений составь таблицу соответствия (сообщения ест в Messages.pas).
Для всех остальных сообщений такой возможности нет, только если тебе не нужно это для конкретных приложений, в которых тебе известны их пользовательские номера сообщений. 

Автор: Snowy 27.4.2006, 08:34
Лучше сделай комбобокс, в который загони все возможные сообщения. 

Автор: gonzales 27.4.2006, 10:18
В общем получается такой возможности нет, хотя это странно 

Автор: Snowy 27.4.2006, 10:25
Ничего странного.
Сообщения - это двухбайтовое число.
Строкового представления они не имеют.
То, что компилятор позволяет тебе использовать констатны - это только для того, чтобы в цифрах не запутаться.
Это ж не RTTI, а WinAPI. 

Автор: Wing 27.4.2006, 20:33
Цитата(Snowy @  27.4.2006,  10:25 Найти цитируемый пост)
Строкового представления они не имеют.

Немного не согласен. Есть очень хитрая функция RegisterWindowMessage. 

Автор: Fin 27.4.2006, 22:41
Цитата(Wing @  27.4.2006,  19:33 Найти цитируемый пост)
Немного не согласен. Есть очень хитрая функция RegisterWindowMessage.  

В MSDN записано следуюшее
Цитата

The RegisterWindowMessage function defines a new window message that is guaranteed to be unique throughout the system. The returned message value can be used when calling the SendMessage or PostMessage function. 

Цитата

Return Values

If the message is successfully registered, the return value is a message identifier in the range 0xC000 through 0xFFFF.
If the function fails, the return value is zero. 

Т.е. сообшения должны быть уникальны для системы. И область выделения номера от 0xC000 и до 0xFFFF. Напомню, что стандартные осообшения начинаются с 0x0001   

Автор: AKN 3.5.2006, 13:08
gonzales,  открой делфю и зажми Ctrl и нажми на слово Messages в списке подключаемых модулей.  Там ты увидишь строковые константы и соответствующие им коды сообщения. напиши функцию, которая бы искала значение кода сообщения по его строковому значению и вставляй это значение в сендмессаг себе на здоровье... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)