Тема: AHK: Отследить перемещение GUI
Можно ли как-то нормальный способом аля "хук", отследить перемещение окна GUI?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Можно ли как-то нормальный способом аля "хук", отследить перемещение окна GUI?
Перемещение происходит самим скриптом или его положение меняет другая программа?
Допустим сам пользователь.
Похожая тема: AHK: Оконтуривание рамки активного окна.
Можно например так:
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
}
Вчера разбирался с "OnMessage", перетаскивание на лкм есть, но хотелось еще выводить контекстное меню по пкм, и вот вопрос возник.. А как оно узнает, у какого окна оно ловит "события"?
Для этого каждому окну свой хэндл установить, в примере это есть.
А где собственно используется этот хэндл в данном примере?
Хех, лишнее удаляя и его удалил, но работает и без него.
Но вопрос то все же в том, как оно определяет на какое именно окно реагировать?
И я тут выяснил, что координаты можно узнать таким способом:
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
}
Вот только как мне избавиться от срабатывания при инициализации.. Нормальным способом, а не тот, что я использовал.
Добавляйте OnMessage после показа окна. WM_MOVE отслеживает положение клиентской области окна. Для отслеживания положения внешней рамки окна есть WM_MOVING.
Хорошо, я использовал 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;
Вот написал пример для всего сразу:
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
}
Это отличный ответ, спасибо.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться