1

Тема: AHK: Получение и обработка, отправка WM_сообщений

Как  получить отдельные составлющие параметров wParam, lParam?

Например, в сообщении WM_MOVE, если я правильно понял, lParam содержит новые координаты окна, которое получает это сообщение. Но lParam - одно значение, как из него получить отдельно координату x и отдельно y?
Как в данном примере получить наоборот, lParam, если известны координаты x и y?

Может ли скрипт отправлять такие сообщения сам себе? Все ли WM_сообщения могут быть отправлены скриптом себе?

2

Re: AHK: Получение и обработка, отправка WM_сообщений

Скрипт отправляет сообщения не "себе", а конкретному окну. Можно отправлять сообщения в том числе и окнам, созданным самим скриптом. Для отправления сообщений используются команды PostMessage / SendMessage, для работы с сообщениями, принимаемыми окнами скрипта, и с их параметрами — функция OnMessage().

Gui, Show, w200 h200
OnMessage(WM_MOVE := 0x3, "WM_MOVE")
return

WM_MOVE(wp, lp, msg, hwnd)
{
   x_client := lp & 0xFFFF
   y_client := lp >> 16
   ToolTip % "x_client = " x_client "`ny_client = " y_client "`nmsg = " msg "`nhwnd = " hwnd
}
studentarh пишет:

Например, в сообщении WM_MOVE, если я правильно понял, lParam содержит новые координаты окна, которое получает это сообщение.

Не совсем правильно, там координаты его клиентской области.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: creature.ws, 2012-09-27 21:50:07)

Re: AHK: Получение и обработка, отправка WM_сообщений


lparam := MAKELONG(123, 234) ; записываем в «одну переменную» два значения.
MsgBox % lparam ; так выглядит lparam содержащий значения координат x = 123, y = 234
MsgBox % LOWORD(lparam) ; читаем младшее слово lparam, его значение равно ранее заданной x координате
MsgBox % HIWORD(lparam) ; читаем старшее слово lparam, его значение равно ранее заданной y координате

points := MAKEPOINTS(MAKELONG(123, 234)) ; записываем координаты в виде одного LONG, записываем LONG в стандартную структуру.
MsgBox % "x: " LOWORD(NumGet(points)) " y: " HIWORD(NumGet(points)) ; Получаем содержимое структуры (LONG) читаем младшее и старшее слово. Подробности по ссылкам в конце сообщения.

; Исправлено во имя здравого смысла
MAKEPOINTS(l)
{
    VarSetCapacity(points, 4) ; Int он же LONG занимает 32 бита (4=32/8)
    , NumPut(l, points, 0, "Int")
    , VarSetCapacity(points, -1) ; http://l.autohotkey.net/docs/commands/VarSetCapacity.htm
    return points
}

MAKELONG(a, b)
{
    return (a & 0xffff) | ((b & 0xffff) << 16)
}

LOWORD(l)
{
    return l & 0xffff
}

HIWORD(l)
{
    return (l >> 16) & 0xffff
}

WM_MOVE message, POINTS structure, Windows Data Types

4 (изменено: studentarh, 2012-09-27 08:57:24)

Re: AHK: Получение и обработка, отправка WM_сообщений

Спасибо! Теперь все начинает проясняться. Буду разбираться с приведенными примерами.