1 (изменено: Phoenixxx_Czar, 2022-05-27 06:14:43)

Тема: AHK: Отследить перемещение GUI

Можно ли как-то нормальный способом аля "хук", отследить перемещение окна GUI?

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

2

Re: AHK: Отследить перемещение GUI

Перемещение происходит самим скриптом или его положение меняет другая программа?

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

3

Re: AHK: Отследить перемещение GUI

Допустим сам пользователь.

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

4

Re: AHK: Отследить перемещение GUI

Похожая тема: AHK: Оконтуривание рамки активного окна.

5

Re: AHK: Отследить перемещение GUI

Можно например так:

Gui +LastFound +AlwaysOnTop +ToolWindow +hwndhGui
Gui Color, 0xDDFFAA
Gui Add, Text, vText x8 y8 w150 h23
Gui Show
WM_MOVE()
OnMessage(0x3, "WM_MOVE")   ; Отслеживаем перемещения окна.
Return

GuiEscape:
GuiClose:
ExitApp

WM_MOVE(){
 global
 WinGetPos, x, y
 GuiControl,, Text, % "Позиция: X: " x ",  Y: " y
}
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

6

Re: AHK: Отследить перемещение GUI

Вчера разбирался с "OnMessage", перетаскивание на лкм есть, но хотелось еще выводить контекстное меню по пкм, и вот вопрос возник.. А как оно узнает, у какого окна оно ловит "события"?

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

7

Re: AHK: Отследить перемещение GUI

Для этого каждому окну свой хэндл установить, в примере это есть.

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

8

Re: AHK: Отследить перемещение GUI

А где собственно используется этот хэндл в данном примере?

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

9

Re: AHK: Отследить перемещение GUI

Хех, лишнее удаляя и его удалил, но работает и без него.

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

10

Re: AHK: Отследить перемещение GUI

Но вопрос то все же в том, как оно определяет на какое именно окно реагировать?

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

11 (изменено: Phoenixxx_Czar, 2022-05-27 20:34:57)

Re: AHK: Отследить перемещение GUI

И я тут выяснил, что координаты можно узнать таким способом:

WM_MOVE(wParam, lParam)
{
	static init := OnMessage(0x3, "WM_MOVE")
	static callCount := 0

	if (callCount < 3)
	{
		callCount++
		return
	}

	x := lParam & 0xFFFF
	y := lParam >> 16

	ToolTip, % x " " y
}

Вот только как мне избавиться от срабатывания при инициализации.. Нормальным способом, а не тот, что я использовал.

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

12

Re: AHK: Отследить перемещение GUI

Добавляйте OnMessage после показа окна. WM_MOVE отслеживает положение клиентской области окна. Для отслеживания положения внешней рамки окна есть WM_MOVING.

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

13

Re: AHK: Отследить перемещение GUI

Хорошо, я использовал WM_MOVING, оно срабатывает как мне нужно. Но как теперь вытащить из lParam нужные мне позиции?

lParam
A pointer to a RECT structure with the current position of the window, in screen coordinates. To change the position of the drag rectangle, an application must change the members of this structure.

typedef struct _RECT {
  LONG left;
  LONG top;
  LONG right;
  LONG bottom;
} RECT, *PRECT;
Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

14

Re: AHK: Отследить перемещение GUI

Вот написал пример для всего сразу:

global exStyles := (WS_EX_COMPOSITED := 0x2000000) | (WS_EX_LAYERED := 0x80000)
     , WM_MOVE   := 0x0003
     , WM_MOVING := 0x0216
     , WS_VSCROLL := 0x00200000

Gui, New, +hwndhGui +E%exStyles%, Window position tracking
Gui, Margin, 20, 20
Gui, Font, s11, Calibri
Gui, Add, Text, w120 Right, WM_MOVE`nClient area position
Gui, Add, Edit, x+5 yp-4 w110 r2 -%WS_VSCROLL%

Gui, Add, Text, xm y+15 w120 Right, WM_MOVING`nWindow position
Gui, Add, Edit, x+5 yp-4 w110 r4 -%WS_VSCROLL%
GuiControl, Focus, Static1
Gui, Show

OnMove := Func("OnGuiMove").Bind(hGui)
OnMessage(WM_MOVE  , OnMove)
OnMessage(WM_MOVING, OnMove)

OnGuiMove(hGui, wp, lp, msg, hwnd) {
   if (hGui != hwnd)
      Return
   
   Switch msg {
      case WM_MOVE   : GuiControl,, Edit1, % "x:" . A_Tab . lp & 0xFFFF . "`n"
                                           . "y:" . A_Tab . lp >> 16
                                           
      case WM_MOVING : GuiControl,, Edit2, % "left:"   . A_Tab . NumGet(lp +  0, "Int") . "`n"
                                           . "top:"    . A_Tab . NumGet(lp +  4, "Int") . "`n"
                                           . "right:"  . A_Tab . NumGet(lp +  8, "Int") . "`n"
                                           . "bottom:" . A_Tab . NumGet(lp + 12, "Int")
   }
}

GuiClose() {
   ExitApp
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15

Re: AHK: Отследить перемещение GUI

Это отличный ответ, спасибо.

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