Здравствуйте все!
Подскажите, где можно найти подробное описание параметров API-шной функции SendMessage(). Насколько я знаю, вторым параметром передаётся целочисленный идентификатор самого сообщения. Я пытаюсь разобрать пример, там несколько вызовов с разными значениями этого параметра, а что они означают — не написано. А хотелось бы знать. Помогите, пожалуйста!
дык собственно идентификатор сообщения. Там в примере что, прям цифирки и написаны? Или WM_ЧТО_ТО? Или WM_USER+цифирка? Если WM_ЧТО_ТО ищи в MSDN, если WM_USER+цифирка то это только автор примера знает. Если цифирка и меньше 0x0400 это одно из стандартных сообщений винды, ищи идентификатор по цифирке в winuser.h (а автор примера явно извращенец).
Спасибо, Odi$$ey, хоть направление пути показал! Раньше мне такими вещами не приходилось заниматься и мне любая информация очень нужна. Однако проблема не решилась. Автора примера ругать не стану, он не планировал свой текст использовать как учебник, и в качестве параметров там только цифирки. Я поискал в winuser.h и определил, что вторая цифирка соответствует WM_SYSCOMMAND, тогда третья должна означать, что именно за сискомманд выполнится. И вот как раз этого-то уже я и не нашёл, ни в MSDN'е, ни в h-файлах. Может, где-то есть заветный линк, где лежит подобная инфа?
Здравствуйте Rajoe, Вы писали:
R>Спасибо, Odi$$ey, хоть направление пути показал! Раньше мне такими вещами не приходилось заниматься и мне любая информация очень нужна. Однако проблема не решилась. Автора примера ругать не стану, он не планировал свой текст использовать как учебник, и в качестве параметров там только цифирки. Я поискал в winuser.h и определил, что вторая цифирка соответствует WM_SYSCOMMAND, тогда третья должна означать, что именно за сискомманд выполнится. И вот как раз этого-то уже я и не нашёл, ни в MSDN'е, ни в h-файлах. Может, где-то есть заветный линк, где лежит подобная инфа?
Дык привел бы здесь свои SendMessag-и, глядишь бы и подсказали...
Здравствуйте 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".
Не буду путать моих уважаемых (и уже почти любимых :)) советчиков и опишу ситуацию подробнее. Я пишу на Visual FoxPro класс окна, которое может передвигаться мышкой за любою точку клиентской части. Есть реализация этого, выглядит (примерно) таким образом:
К сожалению, в 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
Здравствуйте 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>Всё было бы ничего, если бы оно работало, а то работает строго через раз (т.е. на каждый нечётный клик).
Вы дали не весь код. Там явно есть еще что-то, что и мешает работать нормально.
Идентификатор сообщения очень удобно определять в отладчике VC. Для этого в окне Watch нужно указать код этого сообщения или переменную его содержащую и указать модификатор wm.
Например:
uMsg, wm
274 && 0x0112, wm
ну, далее нужно искать описание сообщения в MSDN и/или Windows.h.
Причем лучше иметь Windows.h из поставки наиболее свежего PSDK.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте Rajoe, Вы писали:
R>Не буду путать моих уважаемых (и уже почти любимых :)) советчиков и опишу ситуацию подробнее. Я пишу на Visual FoxPro класс окна, которое может передвигаться мышкой за любою точку клиентской части. Есть реализация этого, выглядит (примерно) таким образом: R>
R>К сожалению, в MSDN мне не удалось найти кодов команд, поэтому я могу только предполагать, что они означают. Во всяком случае, второй параметр — WM_SYSCOMMAND. А вот что в третьем? R>Всё было бы ничего, если бы оно работало, а то работает строго через раз (т.е. на каждый нечётный клик).
для того что бы диалог мог таскаться за любое место достаточно в обработчике нажатия левой кнопки мышки написать одну строку
где lParam — 4 байтное целое в нижнем слове которого должна лежать координата X а в верхнем Y где произошло событие
они наверное тебе приходят в обработчик
Вот так выглядит теперь полный код обработчика 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, и с этим, видимо, ничего не поделаешь. Проект не может стоять на месте, я вынужден оставить эту идею, но я благодарен всем принимавшим столь живое участие в обсуждении. Если вдруг как-нибудь на досуге кто-то из вас всё же найдёт решение этой проблемы, пожалуйста, вспомните обо мне и дайте знать.