SendMessage()
От: Rajoe Россия  
Дата: 08.11.01 14:26
Оценка:
Здравствуйте все!
Подскажите, где можно найти подробное описание параметров API-шной функции SendMessage(). Насколько я знаю, вторым параметром передаётся целочисленный идентификатор самого сообщения. Я пытаюсь разобрать пример, там несколько вызовов с разными значениями этого параметра, а что они означают — не написано. А хотелось бы знать. Помогите, пожалуйста!
Re: SendMessage()
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 08.11.01 15:01
Оценка:
Здравствуйте Rajoe, Вы писали:

R>Здравствуйте все!

R>Подскажите, где можно найти подробное описание параметров API-шной функции SendMessage().

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/messques_8ht1.asp

R>Насколько я знаю, вторым параметром передаётся целочисленный идентификатор самого сообщения. Я пытаюсь разобрать пример, там несколько вызовов с разными значениями этого параметра, а что они означают — не написано. А хотелось бы знать. Помогите, пожалуйста!


дык собственно идентификатор сообщения. Там в примере что, прям цифирки и написаны? Или WM_ЧТО_ТО? Или WM_USER+цифирка? Если WM_ЧТО_ТО ищи в MSDN, если WM_USER+цифирка то это только автор примера знает. Если цифирка и меньше 0x0400 это одно из стандартных сообщений винды, ищи идентификатор по цифирке в winuser.h (а автор примера явно извращенец).
Re[2]: SendMessage()
От: Rajoe Россия  
Дата: 09.11.01 15:04
Оценка:
Спасибо, Odi$$ey, хоть направление пути показал! Раньше мне такими вещами не приходилось заниматься и мне любая информация очень нужна. Однако проблема не решилась. Автора примера ругать не стану, он не планировал свой текст использовать как учебник, и в качестве параметров там только цифирки. Я поискал в winuser.h и определил, что вторая цифирка соответствует WM_SYSCOMMAND, тогда третья должна означать, что именно за сискомманд выполнится. И вот как раз этого-то уже я и не нашёл, ни в MSDN'е, ни в h-файлах. Может, где-то есть заветный линк, где лежит подобная инфа?
Re[3]: SendMessage()
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 09.11.01 15:36
Оценка:
Здравствуйте Rajoe, Вы писали:

R>Спасибо, Odi$$ey, хоть направление пути показал! Раньше мне такими вещами не приходилось заниматься и мне любая информация очень нужна. Однако проблема не решилась. Автора примера ругать не стану, он не планировал свой текст использовать как учебник, и в качестве параметров там только цифирки. Я поискал в winuser.h и определил, что вторая цифирка соответствует WM_SYSCOMMAND, тогда третья должна означать, что именно за сискомманд выполнится. И вот как раз этого-то уже я и не нашёл, ни в MSDN'е, ни в h-файлах. Может, где-то есть заветный линк, где лежит подобная инфа?


Дык привел бы здесь свои SendMessag-и, глядишь бы и подсказали...
Re[3]: SendMessage()
От: Michael Chelnokov Украина  
Дата: 09.11.01 16:18
Оценка:
Здравствуйте Rajoe, Вы писали:

R>Спасибо, Odi$$ey, хоть направление пути показал! Раньше мне такими вещами не приходилось заниматься и мне любая информация очень нужна.


Я бы Вам посоветовал почитать учебник по программированию под Windows (например, Петцольда). В любом учебнике описывается механизм сообщений Windows и, в-частности, оконные сообщения.
А параметры SendMessage таковы:
1. HWND окна, которому предназначено сообщение.
2. Идентификатор типа сообщения (в данном случае WM_SYSCOMMAND). Если Вы в указателе MSDN наберете WM_, то увидите что идентификаторов таких там сотни, и дальнейшие параметры зависят от типа сообщения.
3. Первый параметр сообщения. Для WM_SYSCOMMAND — системная команда (константы SC_...).
4. Второй параметр сообщения. Для WM_SYSCOMMAND — координаты курсора (в младшем слове — x, в старшем — y).

Все это Вы можете найти в MSDM в статьях "SendMessage" и "WM_SYSCOMMAND".
Best regards,
Michael Chelnokov.
Re[4]: SendMessage()
От: Rajoe Россия  
Дата: 12.11.01 13:13
Оценка:
Не буду путать моих уважаемых (и уже почти любимых :)) советчиков и опишу ситуацию подробнее. Я пишу на Visual FoxPro класс окна, которое может передвигаться мышкой за любою точку клиентской части. Есть реализация этого, выглядит (примерно) таким образом:
* обработчик события MouseDown

DECLARE INTEGER GetFocus in WIN32API
Declare INTEGER ReleaseCapture in WIN32API
Declare INTEGER SendMessage in WIN32API INTEGER, INTEGER, INTEGER, INTEGER

lnHandle = GetFocus()
bb = ReleaseCapture()
mc001A = 274         && 0x0112
mc001C = -4078        && 0xF012
bb = SendMessage(lnHandle, mc001A, mc001C, 0)

К сожалению, в MSDN мне не удалось найти кодов команд, поэтому я могу только предполагать, что они означают. Во всяком случае, второй параметр — WM_SYSCOMMAND. А вот что в третьем?
Всё было бы ничего, если бы оно работало, а то работает строго через раз (т.е. на каждый нечётный клик).
Re: SendMessage()
От: Аноним  
Дата: 12.11.01 13:57
Оценка:
Здравствуйте Rajoe, Вы писали:

R>Здравствуйте все!

R>Подскажите, где можно найти подробное описание параметров API-шной функции SendMessage(). Насколько я знаю, вторым параметром передаётся целочисленный идентификатор самого сообщения. Я пытаюсь разобрать пример, там несколько вызовов с разными значениями этого параметра, а что они означают — не написано. А хотелось бы знать. Помогите, пожалуйста!
Здравствуйте Rajoe, Вы писали:

R>Здравствуйте все!

R>Подскажите, где можно найти подробное описание параметров API-шной функции SendMessage(). Насколько я знаю, вторым параметром передаётся целочисленный идентификатор самого сообщения. Я пытаюсь разобрать пример, там несколько вызовов с разными значениями этого параметра, а что они означают — не написано. А хотелось бы знать. Помогите, пожалуйста!

Насклько Я помню там необходимо указать дескриптор, потом идут сообщение ,LPARAM и WPARAM т.е и что получатель должен сделать т.е сообщение и и уже конкретно что.
Пример посылаем сообщение для листбокса добавить строку.

SendMessage(hWnd,MESSAGE, MESSAGE, LPARAМ(строка))
Приведение типов, только непомню LPARAM илиWPARAM
Re[5]: SendMessage()
От: Michael Chelnokov Украина  
Дата: 12.11.01 15:48
Оценка:
Здравствуйте Rajoe, Вы писали:

R>Не буду путать моих уважаемых (и уже почти любимых :)) советчиков и опишу ситуацию подробнее. Я пишу на Visual FoxPro класс окна, которое может передвигаться мышкой за любою точку клиентской части. Есть реализация этого, выглядит (примерно) таким образом:

R>* обработчик события MouseDown
[skipped]
R>lnHandle = GetFocus()
R>bb = ReleaseCapture()
А где делается GetCapture?

R>mc001A = 274 && 0x0112

R>mc001C = -4078 && 0xF012
R>bb = SendMessage(lnHandle, mc001A, mc001C, 0)
Хм... Я не нашел команды с кодом 0xF012... Вот их полный список из моего winuser.h:
/*
* System Menu Command Values
*/
#define SC_SIZE 0xF000
#define SC_MOVE 0xF010
#define SC_MINIMIZE 0xF020
#define SC_MAXIMIZE 0xF030
#define SC_NEXTWINDOW 0xF040
#define SC_PREVWINDOW 0xF050
#define SC_CLOSE 0xF060
#define SC_VSCROLL 0xF070
#define SC_HSCROLL 0xF080
#define SC_MOUSEMENU 0xF090
#define SC_KEYMENU 0xF100
#define SC_ARRANGE 0xF110
#define SC_RESTORE 0xF120
#define SC_TASKLIST 0xF130
#define SC_SCREENSAVE 0xF140
#define SC_HOTKEY 0xF150
#if(WINVER >= 0x0400)
#define SC_DEFAULT 0xF160
#define SC_MONITORPOWER 0xF170
#define SC_CONTEXTHELP 0xF180
#define SC_SEPARATOR 0xF00F
#endif /* WINVER >= 0x0400 */

По логике, это какая-то модификация SC_MOVE... ;)

R>Всё было бы ничего, если бы оно работало, а то работает строго через раз (т.е. на каждый нечётный клик).

Вы дали не весь код. Там явно есть еще что-то, что и мешает работать нормально.
Best regards,
Michael Chelnokov.
Re[5]: SendMessage()
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.11.01 21:02
Оценка:
Здравствуйте Rajoe.

Идентификатор сообщения очень удобно определять в отладчике VC. Для этого в окне Watch нужно указать код этого сообщения или переменную его содержащую и указать модификатор wm.

Например:

uMsg, wm
274 && 0x0112, wm

ну, далее нужно искать описание сообщения в MSDN и/или Windows.h.

Причем лучше иметь Windows.h из поставки наиболее свежего PSDK.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: SendMessage()
От: Edward Россия  
Дата: 13.11.01 08:53
Оценка:
Здравствуйте Rajoe, Вы писали:

R>Не буду путать моих уважаемых (и уже почти любимых :)) советчиков и опишу ситуацию подробнее. Я пишу на Visual FoxPro класс окна, которое может передвигаться мышкой за любою точку клиентской части. Есть реализация этого, выглядит (примерно) таким образом:

R>
R>* обработчик события MouseDown

R>DECLARE INTEGER GetFocus in WIN32API
R>Declare INTEGER ReleaseCapture in WIN32API
R>Declare INTEGER SendMessage in WIN32API INTEGER, INTEGER, INTEGER, INTEGER

R>lnHandle = GetFocus()
R>bb = ReleaseCapture()
R>mc001A = 274         && 0x0112
R>mc001C = -4078        && 0xF012
R>bb = SendMessage(lnHandle, mc001A, mc001C, 0)
R>

R>К сожалению, в MSDN мне не удалось найти кодов команд, поэтому я могу только предполагать, что они означают. Во всяком случае, второй параметр — WM_SYSCOMMAND. А вот что в третьем?
R>Всё было бы ничего, если бы оно работало, а то работает строго через раз (т.е. на каждый нечётный клик).

для того что бы диалог мог таскаться за любое место достаточно в обработчике нажатия левой кнопки мышки написать одну строку
SendMessage( hwnd, WM_NCLBUTTONDOWN, HTBOTTOMRIGHT, lParam );


в твоем случае это будет что-то типа
bb = SendMessage(lnHandle, 0x00A1, 0x11, lParam)

где lParam — 4 байтное целое в нижнем слове которого должна лежать координата X а в верхнем Y где произошло событие
они наверное тебе приходят в обработчик

best wishes
Ed.ward
Re[6]: SendMessage()
От: Rajoe Россия  
Дата: 13.11.01 11:04
Оценка:
Вот так выглядит теперь полный код обработчика MouseDown формы:
LPARAMETERS nButton, nShift, nXCoord, nYCoord
if m.nButton = 1 and m.nShift = 0
  ReleaseCapture()
  PostMessage(GetFocus(), 0x0112, 0xF012, 0)
endif

ReleaseCapture() делается на всякий случай, если где-то был вызван GetCapture(). Кстати, без него всё работает точно также, то есть через раз.
Пробовал в Delphi перекрыть обработчик OnMouseDown (текст идентичный). Там работает немного по-другому: срабатывает каждый раз, но почему-то перестаёт вызываться обработчик OnMouseUp. ??????!!
Способ Эдварда тоже не привёл к положительным результатам. Согласно константе HTBOTTOMRIGHT окно, правда, успешно меняет размеры, но я хотел другого :) Использование константы HTCAPTION не привело вообще ни к чему.
Единственное разумное объяснение такого поведения окна — его нестандартная реализация в FoxPro, и с этим, видимо, ничего не поделаешь. Проект не может стоять на месте, я вынужден оставить эту идею, но я благодарен всем принимавшим столь живое участие в обсуждении. Если вдруг как-нибудь на досуге кто-то из вас всё же найдёт решение этой проблемы, пожалуйста, вспомните обо мне и дайте знать.

Всего хорошего!
Раджо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.