1

Тема: AHK: Как вы используете WM и для чего

Какие вы используете WM message и для чего?

Из самого распространенного знаю про 0x201 (WM_LBUTTONDOWN), который используют для перемещения интерфейса зажавши ЛКМ в любом месте интерфейса.
0x3 (WM_MOVE) который вызывается, когда идет перемещение окна.
0x0204 (WM_RBUTTONDOWN) когда нажимается ПКМ в интерфейсе (можно выводить контекстное меню допустим).

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

2

Re: AHK: Как вы используете WM и для чего

Не совсем понятен вопрос. Это всё равно что спросить, какая ваша любимая команда в AHK. Сообщения используются для того, для чего они предназначены — для обмена информацией между окнами. Получив сообщение, окно (точнее приложение, которому принадлежит окно) совершает действие в зависимости от номера сообщения и данных, переданных в wParam и lParam. Для многих сообщений в AHK есть эквиваленты в виде команд. Когда они вызываются, AHK «под капотом» отправляет соответствующие сообщения. Например, WinClose соответствует WM_CLOSE. Когда такого эквивалента нет, можно использовать сообщения напрямую:

Gui, Add, Edit, w200 hwndhEdit
SendMessage, EM_SETCUEBANNER := 0x1501, true, "Поиск",, ahk_id %hEdit%
Gui, Show
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Как вы используете WM и для чего

Скорее вопрос про onMessage. У нас есть такой список, но смотреть, что делает каждое - долго.
Возможно это вопрос чем-то схожий с "какая ваша любимая команда в AHK", но думаю эта тема более специфическая. И было бы не плохо услышать, что чаще всего используют и для чего.

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

4

Re: AHK: Как вы используете WM и для чего

Что чаще всего используют — это зависит от области применения. Например, для контрола ListView есть G-Label Notifications. По сути это OnMessage(0x4E, "WM_NOTIFY"). На те случаи, что не учтены, используется OnMessage(0x4E, "WM_NOTIFY") напрямую. Например, с помощью обычных уведомлений можно узнать номер ряда, по которому кликнули:

Gui, Add, ListView, AltSubmit Grid r5 gNotify, Col 1|Col 2|Col 3|Col 4
Loop 5
   LV_Add()
Gui, Show

Notify() {
   if (A_GuiEvent = "Normal")
      MsgBox, % "Row number: " . A_EventInfo
}

Но номер колонки узнать не получится. Это можно сделать, только если использовать OnMessage:

Gui, Add, ListView, Grid r5, Col 1|Col 2|Col 3|Col 4
Loop 5
   LV_Add()
Gui, Show
OnMessage(0x4E, "WM_NOTIFY")
Return

GuiClose:
   ExitApp

WM_NOTIFY(wp, lp) {
   static notices := {-2: "NM_CLICK", -3: "NM_DBLCLK"}
   notice := NumGet(lp + A_PtrSize*2, "Int")
   if action := notices[notice]
      ToolTip % "Action: " . action                                  . "`n"
              . "Row: "    . NumGet(lp + A_PtrSize*3,     "Int") + 1 . "`n"
              . "Column: " . NumGet(lp + A_PtrSize*3 + 4, "Int") + 1
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: Phoenixxx_Czar, 2022-06-08 03:14:52)

Re: AHK: Как вы используете WM и для чего

Привел бы еще в пример WM_SETCURSOR:

global hBtn1, hBtn2, hBtn3

gui, add, button, w200 hwndhBtn1, Cursor hand
gui, add, button, w200 hwndhBtn2, Cursor help
gui, add, button, w200 hwndhBtn3, Cursor help and tooltip
gui, add, button, w200, Default button

gui, show
return


WM_SETCURSOR(wParam)
{
	static init := OnMessage(0x20, "WM_SETCURSOR")
	static IDC_APPSTARTING := 32650, IDC_ARROW := 32512, IDC_CROSS := 32515, IDC_HAND := 32649, IDC_HELP := 32651, IDC_IBEAM := 32513, IDC_ICON := 32641, IDC_NO := 32648, IDC_SIZE := 32640, IDC_SIZEALL := 32646, IDC_SIZENESW := 32643, IDC_SIZENS := 32645, IDC_SIZENWSE := 32642, IDC_SIZEWE := 32644, IDC_UPARROW := 32516, IDC_WAIT := 32514

	switch (wParam)
	{
		case hBtn1:
		{
			setCursor(IDC_HAND)
		}
		case hBtn2:
		{
			setCursor(IDC_HELP)
		}
		case hBtn3:
		{
			tooltip, % "message"
			setCursor(IDC_HELP)
		}
		default:
		{
			setCursor(IDC_ARROW)
			toolTip
			return false
		}
	}

	return true
}

loadCursor(cursorId)
{
	static IMAGE_CURSOR := 2, flags := (LR_DEFAULTSIZE := 0x40) | (LR_SHARED := 0x8000)
	return DllCall("LoadImage", "Ptr", 0, "UInt", cursorId, "UInt", IMAGE_CURSOR, "Int", 0, "Int", 0, "UInt", flags, "Ptr")
}

setCursor(cursorIDC)
{
	static cursorLoads := {}

	if (!cursorLoads[cursorIDC])
	{
		cursorLoads[cursorIDC] := loadCursor(cursorIDC)
	}

	return DllCall("SetCursor", "Ptr", cursorLoads[cursorIDC])
}
Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

6

Re: AHK: Как вы используете WM и для чего

У нас есть такой список

Только вот про 'EM_SETCUEBANNER := 0x1501' ни строчки. Хотя довольно интересная фича.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

7

Re: AHK: Как вы используете WM и для чего

Phoenixxx_Czar пишет:

Привел бы еще в пример WM_SETCURSOR

Этак у вас получится, что курсор назначенный на кнопке остаётся и при выходе за неё. Чтобы было виднее, добавьте

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

8

Re: AHK: Как вы используете WM и для чего

__Михаил__ пишет:

Только вот про 'EM_SETCUEBANNER := 0x1501' ни строчки

Так этот список далеко не полный.

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

9

Re: AHK: Как вы используете WM и для чего

Меня больше удивляет почему на странице перечислены лишь некоторые варианты, хоть бы какие-то примеры показали, интересно же что ещё можно добавить по умолчанию в свою программу.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

10

Re: AHK: Как вы используете WM и для чего

Предполагаю, что этот список был составлен очень давно, ещё во времена AHK-basic, и с тех пор не пополнялся. Да и смысла в нём действительно немного без описания, проще сразу в MSDN смотреть.

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

11

Re: AHK: Как вы используете WM и для чего

В MSDN вроде как только названия без Hex значений, что не совсем удобно.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

12

Re: AHK: Как вы используете WM и для чего

Практически все значения можно найти здесь.

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

13

Re: AHK: Как вы используете WM и для чего

teadrinker пишет:
__Михаил__ пишет:

Только вот про 'EM_SETCUEBANNER := 0x1501' ни строчки

Так этот список далеко не полный.

Так это же не оконное сообщение, поэтому и нету.

14

Re: AHK: Как вы используете WM и для чего

А, ну может быть там собраны сообщения только для окон верхнего уровня. Но тоже неполный, например WM_SYSTIMER отсутствует. Вот тут больше.

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

15

Re: AHK: Как вы используете WM и для чего

Microsoft Spy++ 1194 в своих настройках показывает.
Правда без значений.

16

Re: AHK: Как вы используете WM и для чего

Еще больше сообщений можно найти в AutoGUI Tools Constantine. Они там по категориям рассортированы: Button, Edit, Hotkey и т.д. Но тоже не все.

17

Re: AHK: Как вы используете WM и для чего

Да, я им тоже иногда пользуюсь, получается быстрее, чем в интернет идти. Но там тоже много чего нет.

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

18 (изменено: Phoenixxx_Czar, 2022-06-08 03:14:38)

Re: AHK: Как вы используете WM и для чего

teadrinker пишет:
Phoenixxx_Czar пишет:

Привел бы еще в пример WM_SETCURSOR

Этак у вас получится, что курсор назначенный на кнопке остаётся и при выходе за неё. Чтобы было виднее, добавьте

Gui, Margin, 50, 50

Кхм.. Как это лучше пофиксить?

UPD: Добавил в default кейс следующую строку:

setCursor(IDC_ARROW)
Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

19

Re: AHK: Как вы используете WM и для чего

Или так:

WM_SETCURSOR(wParam)
{
	static init := OnMessage(0x20, "WM_SETCURSOR")
	static IDC_APPSTARTING := 32650, IDC_ARROW := 32512, IDC_CROSS := 32515, IDC_HAND := 32649, IDC_HELP := 32651, IDC_IBEAM := 32513, IDC_ICON := 32641, IDC_NO := 32648, IDC_SIZE := 32640, IDC_SIZEALL := 32646, IDC_SIZENESW := 32643, IDC_SIZENS := 32645, IDC_SIZENWSE := 32642, IDC_SIZEWE := 32644, IDC_UPARROW := 32516, IDC_WAIT := 32514

	switch (wParam)
	{
		case hBtn1: Return setCursor(IDC_HAND)
		case hBtn2: Return setCursor(IDC_HELP)
		case hBtn3:
			tooltip message
			Return setCursor(IDC_HELP)
		default: toolTip
	}
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder