Тема: AHK: Послать клик мышкой в определённое место минимизированного окна
Если у приложения нету видимых контролов.
И без его активации.
Возможно вообще?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Серый форум → Общение → AutoHotkey → AHK: Послать клик мышкой в определённое место минимизированного окна
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Если у приложения нету видимых контролов.
И без его активации.
Возможно вообще?
Malcev, если я правильно скомпилировал ваш поток мыслей, то вопрос состоит в том, что возможно ли вообще послать клик мышкой в определённое место минимизированного окна без его активации, если у приложения нету видимых контролов. Верно?
Один из возможных способов - отправлять окну с идентификатором id сообщение о клике мышкой по кооординатам x, y:
PostMessage, 0x201, 1, ((y<<16)^x), , ahk_id %id% ;WM_LBUTTONDOWN:=0x201
PostMessage, 0x202 , 0, ((y<<16)^x), , ahk_id %id% ;WM_LBUTTONUP:=0x202
А можно пояснить,
1, ((y<<16)^x),
Почему при нажатии 1, а при отжатии 0.
И что означает (y<<16)^x
Я там уже ползал, но не нашёл ответа.
Может просветишь вкратце?
И кстати в ноутпаде такое не прокатывает
settitlematchmode 2
f11::
PostMessage, 0x201, 1, ((100<<16)^100), , ahk_class Notepad ;WM_LBUTTONDOWN
PostMessage, 0x202, 0, ((100<<16)^100), , ahk_class Notepad ;WM_LBUTTONUP
Если вкратце, то 1 означает установку бита MK_LBUTTON в состояние ON (сообщает окну, что нажата ЛКМ),
а конструкция (y<<16)^x "упаковывает", так сказать, координаты x и y в lParam, т.е. старшая часть (3,4 байты) содержит y, а младшая чать (1,2 байты) содержит x
В Опере работает так:
F11:: MouseGetPos x, y, id
F12::
PostMessage, 0x201, 1, ((y<<16)^x), , ahk_id %id%
PostMessage, 0x202 , 0, ((y<<16)^x), , ahk_id %id%
return
Но почему-то координаты нажатия по F11 берутся от угла всего окна, а отправляются через PostMessage со смещением на ширину заголовка. Непонятно, почему, но можно компенсировать.
Вот смотри, я запускаю блокнот, обвожу там весь текст в документе, мышку оставляю в зоне выделения.
Потоми запускаю твой скрипт и текст продолжает оставаться выделенным.
F11:: MouseGetPos x, y, id
F12::
PostMessage, 0x201, 1, ((y<<16)^x), , ahk_id %id%
PostMessage, 0x202 , 0, ((y<<16)^x), , ahk_id %id%
return
Как так?
У тебя условие какое? Если приложение не имеет видимых контролов. А у блокнота один такой большой контрол Edit, которому и надо отправлять сообщение.
F11:: MouseGetPos x, y, id, cont
F12::
PostMessage, 0x201, 1, ((y<<16)^x), %cont%, ahk_id %id%
PostMessage, 0x202 , 0, ((y<<16)^x), %Cont%, ahk_id %id%
return
Или, модернизируя твой пример:
settitlematchmode 2
F12::
PostMessage, 0x201, 1, ((100<<16)^100), Edit1, ahk_class Notepad
PostMessage, 0x202 , 0, ((100<<16)^100), Edit1, ahk_class Notepad
return
Да, теперь понятно спасибо!
Но почему-то координаты нажатия по F11 берутся от угла всего окна, а отправляются через PostMessage со смещением на ширину заголовка. Непонятно, почему, но можно компенсировать.
Можно вот этим кодом.
F11::
SysGet, TitleBarHeight, 4
msgbox %TitleBarHeight%
Нет, всё-таки не всё понятно
У тебя условие какое? Если приложение не имеет видимых контролов. А у блокнота один такой большой контрол Edit, которому и надо отправлять сообщение.
Но в справке сказано
Control - If this parameter is blank or omitted, the message will be sent directly to the target window rather than one of its controls.
http://www.autohotkey.com/docs/commands/PostMessage.htm
Что имеется ввиду под Target Window - Окно блокнота целиком (его периметр)?
Или все места без обозначеннных контролов?
И куда в итоге посылается клик при конструкции без указания контрола в ноутпаде?
Один из возможных способов - отправлять окну с идентификатором id сообщение о клике мышкой по кооординатам x, y:
А что есть ещё другие варианты?
Это я так, чисто для самообразования.
Если в родительском окне по координатам 0:0 находиться верхний левый угол некого дочернего окна имеющего размеры 100x100px, то клик отправленный в родительское окно по координатам 50:50 не придётся на дочернее окно, клик будет произведён «под ним» по родительскому.
Под Target Window имеется в виду окно по которому будет произведён клик. (В контексте вышеупомянутого использования PostMessage)
Родительское и дочерние окна — как слои в графическом редакторе не следует «видеть» их «глазами пользователя».
creature.ws, спасибо.
Картина вырисовывается.
IfWinactive, ahk_exe MyProgram.exe
Send, {F2}{alt}{t}{v}{f}
ControlClick, button2, * - MyProgram ahk_class MyProgram .Class.Frame, , left, , , x136 y18 NA
WinWait, MySubWindow -- MyTitle
Winhide, MySubWindow -- MyTitle
WinWaitClose, MySubWindow -- MyTitle
Sleep, 300
Send, ^+{vkDB}
Sleep, 300
Send, {alt}{t}{w}
Return
Reload
Имеется сценарий, по которому в программу посылаются нажатия клавиш, далее открывается дочернее окно программы со шкалой прогресса, по завершению прогресса окно закрывается, в результате чего отправляется еще группа клавиш. Скажите, пожалуйста, возможно ли реализовать данный сценарий при свернутом на панель задач окне программы?
Некоторые программы в свёрнутом виде воспринимают ControlClick, нужно пробовать.
Если вкратце, то 1 означает установку бита MK_LBUTTON в состояние ON (сообщает окну, что нажата ЛКМ).
1. А как вы это узнали?
По ссылке, что вы приводили - для wParam идёт список допустимых значений:
MK_CONTROL
MK_LBUTTON
MK_MBUTTON
MK_RBUTTON
MK_SHIFT
MK_XBUTTON1
MK_XBUTTON2
Если все эти значения - биты, то ваша 1 - это значение в какой системе и откуда оно получилось? Не должен ли MK_LBUTTON ON быть 0100000 в двоичной системе (или 20 в шестнадцатеричной или 32 в десятичной)?
2. Можете поподробнее рассказать про возможные аргументы wParam для этого и аналогичных сообщений? могут ли быть комбинации этих битов или оно не будет иметь смысл?
3. Какой смысл у значений вроде MK_MBUTTON/MK_RBUTTON, если отправляемая кнопка мыши зависит от (номера) посылаемого сообщения? Эти аргументы wParam же приведены для сообщения WM_LBUTTONDOWN! Что будет если отправить wParam=MK_RBUTTON для этого сообщения?
Если кто-нибудь кроме ув. Irbis знает ответы на мои вопросы - прошу, ответьте!
Drugoy,
На сайте microsoft'а байты расписаны. Они Могут быть в шестнадцатеричной или в десятичной системе счисления, так же их можно комбинировать.
В сообщениях WM_[L,R,M]BUTTON[DOWN,UP] Вроде как если задать параметр в wParam то не чего не будет(то есть в постах выше он нечего не делает. но возможно и ошибаюсь). Но вот если получать ответ то можно узнать какая кнопка на данный момент нажата физически. Вот пример с ответом своего окна:
(Исправленный вариант постом нижу у Alectric)
yalanne, что-то больно много скобочек. Так лучше:
msg := 0x201 ; WM_LBUTTONDOWN
SetFormat, IntegerFast, H ; Нужен только для первой строчки тултипа, показывает в hex'е число.
Gui, Show,w100 h100
OnMessage(msg, "WM_$BUTTON")
Return
WM_$BUTTON(wParam, lParam)
{
ToolTip % "Все:`t`t`t`t" wParam "`tlParam=" lParam "`n"
. "`n[MK_CONTROL] Клавиша Ctrl:`t`t" ( wParam&0x8 ? "" : "не") " нажата`n"
. "`n[MK_LBUTTON] Клавиша LButton:`t" ( wParam&0x1 ? "" : "не") " нажата`n"
. "`n[MK_MBUTTON] Клавиша MButton:`t" ( wParam&0x10 ? "" : "не") " нажата`n"
. "`n[MK_RBUTTON] Клавиша RButton:`t" ( wParam&0x2 ? "" : "не") " нажата`n"
. "`n[MK_SHIFT] Клавиша Shift:`t`t" ( wParam&0x4 ? "" : "не") " нажата`n"
. "`n[MK_XBUTTON1] Клавиша XBUTTON1:`t" ( wParam&0x20 ? "" : "не") " нажата`n"
. "`n[MK_XBUTTON2] Клавиша XBUTTON2:`t" ( wParam&0x40 ? "" : "не") " нажата`n"
. "`nx " lParam&0xffff
. "`ny " lParam>> 16
}
Попутно тему нашел.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться