1

Тема: AHK: Послать клик мышкой в определённое место минимизированного окна

Если у приложения нету видимых контролов.
И без его активации.
Возможно вообще?

2

Re: AHK: Послать клик мышкой в определённое место минимизированного окна

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

3

Re: AHK: Послать клик мышкой в определённое место минимизированного окна

А можно пояснить,

 1, ((y<<16)^x),

Почему при нажатии 1, а при отжатии 0.
И что означает (y<<16)^x

4

Re: AHK: Послать клик мышкой в определённое место минимизированного окна

WM_LBUTTONDOWN

5 (изменено: Malcev, 2012-04-16 22:09:20)

Re: AHK: Послать клик мышкой в определённое место минимизированного окна

Я там уже ползал, но не нашёл ответа.
Может просветишь вкратце?
И кстати в ноутпаде такое не прокатывает

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

6 (изменено: Irbis, 2012-04-16 22:16:36)

Re: AHK: Послать клик мышкой в определённое место минимизированного окна

Если вкратце, то 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 со смещением на ширину заголовка. Непонятно, почему, но можно компенсировать.

7

Re: AHK: Послать клик мышкой в определённое место минимизированного окна

Вот смотри, я запускаю блокнот, обвожу там весь текст в документе, мышку оставляю в зоне выделения.
Потоми запускаю твой скрипт и текст продолжает оставаться выделенным.

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

Как так?

8 (изменено: Irbis, 2012-04-17 13:50:25)

Re: AHK: Послать клик мышкой в определённое место минимизированного окна

У тебя условие какое? Если приложение не имеет видимых контролов. А у блокнота один такой большой контрол 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

9

Re: AHK: Послать клик мышкой в определённое место минимизированного окна

Да, теперь понятно спасибо!

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

Можно вот этим кодом.

F11:: 
SysGet, TitleBarHeight, 4
msgbox %TitleBarHeight%

10 (изменено: Malcev, 2012-04-16 23:59:32)

Re: AHK: Послать клик мышкой в определённое место минимизированного окна

Нет, всё-таки не всё понятно

У тебя условие какое? Если приложение не имеет видимых контролов. А у блокнота один такой большой контрол 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:

А что есть ещё другие варианты?
Это я так, чисто для самообразования.

11 (изменено: creature.ws, 2012-04-17 00:58:59)

Re: AHK: Послать клик мышкой в определённое место минимизированного окна

Если в родительском окне по координатам 0:0 находиться верхний левый угол некого дочернего окна имеющего размеры 100x100px, то клик отправленный в родительское окно по координатам 50:50 не придётся на дочернее окно, клик будет произведён «под ним»  по родительскому.

Под Target Window имеется в виду окно по которому будет произведён клик. (В контексте вышеупомянутого  использования PostMessage)

Родительское и дочерние окна — как слои в графическом редакторе не следует «видеть» их «глазами пользователя».

12

Re: AHK: Послать клик мышкой в определённое место минимизированного окна

creature.ws, спасибо.
Картина вырисовывается.

13 (изменено: becauseim, 2015-09-08 10:49:24)

Re: AHK: Послать клик мышкой в определённое место минимизированного окна


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

Имеется сценарий, по которому в программу посылаются нажатия клавиш, далее открывается дочернее окно программы со шкалой прогресса, по завершению прогресса окно закрывается, в результате чего отправляется еще группа клавиш. Скажите, пожалуйста, возможно ли реализовать данный сценарий при свернутом на панель задач окне программы?

14

Re: AHK: Послать клик мышкой в определённое место минимизированного окна

Некоторые программы в свёрнутом виде воспринимают ControlClick, нужно пробовать.

15

Re: AHK: Послать клик мышкой в определённое место минимизированного окна

Irbis пишет:

Если вкратце, то 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 для этого сообщения?

16

Re: AHK: Послать клик мышкой в определённое место минимизированного окна

Если кто-нибудь кроме ув. Irbis знает ответы на мои вопросы - прошу, ответьте!

17 (изменено: yalanne, 2015-09-14 12:04:20)

Re: AHK: Послать клик мышкой в определённое место минимизированного окна

Drugoy,
На сайте microsoft'а байты расписаны. Они Могут быть в шестнадцатеричной или в десятичной системе счисления, так же их можно комбинировать.
В сообщениях WM_[L,R,M]BUTTON[DOWN,UP] Вроде как если задать параметр в wParam то не чего не будет(то есть в постах выше он нечего не делает. но возможно и ошибаюсь). Но вот если получать ответ то можно узнать какая кнопка на данный момент нажата физически. Вот пример с ответом своего окна:
(Исправленный вариант постом нижу у Alectric)

18 (изменено: Alectric, 2015-09-14 11:57:01)

Re: AHK: Послать клик мышкой в определённое место минимизированного окна

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
}

Попутно тему нашел.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.