Re[8]: Кликнуть в скрытое окно
От: Carc Россия http://www.amlpages.com/home.php
Дата: 07.08.19 08:07
Оценка: +1
Здравствуйте, Cannol, Вы писали:

C>Здравствуйте, Carc, Вы писали:

C>>Можно юзать SendInput — обычно работает.
C>Да, его и использую больше всего.


C>Я писал:

C>>Т.е., после вызова SetCursorPos() я всё равно пробовал отправлять сообщения о нажатии вместе с координатами клика (pt.x, pt.y).
C>>Так всё равно не работает.

C>Уже более понятно с сообщением о координатах, сейчас без всякого SetCursorPos() управляюсь. Когда окно физически видно — всё отлично. Но снова, как только окно делается скрытым или выводится за пределы рабочего стола — ввод не ловится в том окне. Увы:

C>
C>...
C>else if (byCodeOption == 1)
C>{
C>    #define ABSOLUTE_XY_MAX 65535

C>    INPUT input={0};
C>    // left movement
C>    int screenX = GetSystemMetrics(SM_CXSCREEN);
C>    int screenY = GetSystemMetrics(SM_CYSCREEN);
C>    input.type = INPUT_MOUSE;
C>    input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE; // mouse movement
C>    input.mi.dx = pt.x * (ABSOLUTE_XY_MAX / screenX); input.mi.dy = pt.y * (ABSOLUTE_XY_MAX / screenY);


чего то мне не нравится выше флаги

If MOUSEEVENTF_ABSOLUTE value is specified, dx and dy contain normalized absolute coordinates between 0 and 65,535. The event procedure maps these coordinates onto the display surface. Coordinate (0,0) maps onto the upper-left corner of the display surface; coordinate (65535,65535) maps onto the lower-right corner. In a multimonitor system, the coordinates map to the primary monitor.

Чего та вычисления неясные?


// А вот тут что не нужно что ли координаты указывать?
.…
C>    ZeroMemory(&input,sizeof(INPUT)); //clear out input
C>    input.type = INPUT_MOUSE;
C>    input.mi.dwFlags = MOUSEEVENTF_LEFTUP; // mouse button up
C>    SendInput(1,&input,sizeof(INPUT));
C>}
C>


C>Не судьба, видимо, с IE подружиться.

Думаю, надо прощее быть…
Выносить функцию сенд-инпученья в отдельный модуль, и гонять ее тестами и смотреть что к чему.
Сдается мне всё должно работать, только нужно четко и аккуратно с параметрами и ремарками из МСДЫНъ.
А то там вон много чего про флаги в MSDN сказано, что координаты могут относиться только к основному монитору и все такое.

Плюс. Ну безусловно, коды возврата WinAPI функций надо проверять, в нашем случае SendInput. Ну заобязательно просто. Они много чего могут сказать, может что-то просто не отрабатывает и все тут.

И PS: как уже писал выше, такой SendInput ловится на раз LowLevel-хуком (там флаги это показывают), и соответственно нечто сбоку работающее может запросто фильтровать такой искуственный ввод, и просто его не пропускать. В частности и сам Internet Explorer.
Ну это уже из разряда страшилок, но все же…
Aml Pages Home
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.