Приветствую, коллеги!
Я разрабатываю собственный автокликер, который смог бы рулить не активным, а свернутым (или хотя бы отправленным на задний экран) окном. Для эмуляции нажатия кнопок и кликов мышью я использую собщения WINAPI
Например, вот так можно послать нажатие кнопки KeySC глобально (в активное окно):
Код:
keybd_event(MapVirtualKey(KeySC , MAPVK_VSC_TO_VK),KeySC , NULL, NULL );
Sleep(25);
keybd_event(MapVirtualKey(KeySC , MAPVK_VSC_TO_VK),KeySC , KEYEVENTF_KEYUP, NULL );
А вот эмуляция клика мыши:
Код:
INPUT Input={0};
Input.type = INPUT_MOUSE;
Input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
::SendInput(1,&Input,sizeof(INPUT));
Sleep(25);
Input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
::SendInput(1,&Input,sizeof(INPUT));
Окей, все это никому не интересно и всем давно известно, да? Хорошо, переходим к интересной части: посылка нажатий кнопки в свернутое окно:
Код:
int virtual_code = MapVirtualKeyA(scancode, MAPVK_VSC_TO_VK);
LPARAM lp = scancode << 16 | 1;
PostMessageA(wnd, WM_KEYDOWN, virtual_code, lp);
Sleep(25);
lp = 1 << 31 | 1 << 30 | scancode << 16 | 1;
PostMessageA(wnd, WM_KEYUP, virtual_code, lp);
И все это работает. Без проблем. А вот с мышкой -- засада. Вот я пытаюсь ее сэмулировать:
Код:
// clicks::cPoint -- это класс с методами x() и у(), описывающий точку, куда кликаем
void MouseMessage(UINT message, clicks::cPoint *point, LPARAM param)
{
RECT rect;
GetWindowRect(wnd, &rect);
RECT crect;
GetClientRect(wnd, &crect);
int x = point->x();
int y = point->y();
qDebug() << x << y;
POINT p;
p.x = x;
p.y = y;
ScreenToClient(wnd,&p);
x = p.x;
y = p.y;
WPARAM mouse_coords = x + y*256*256;
SendMessageA(wnd, WM_NCHITTEST, 0, mouse_coords);
SendMessageA(wnd, WM_SETCURSOR, (LPARAM)wnd, MAKEWPARAM(HTCLIENT,message));
PostMessageA(wnd, message, param, mouse_coords);
}
MouseMessage(WM_MOUSEMOVE, point);clicks::delay(10);
MouseMessage(down_message, point, mouse_button);clicks::delay(10);
MouseMessage(WM_MOUSEMOVE, point, mouse_button);clicks::delay(10);
MouseMessage(WM_MOUSEMOVE, point, mouse_button);clicks::delay(10);
MouseMessage(WM_MOUSEMOVE, point, mouse_button);clicks::delay(10);
MouseMessage(WM_MOUSEMOVE, point, mouse_button);clicks::delay(10);
MouseMessage(WM_MOUSEMOVE, point, mouse_button);clicks::delay(10);
MouseMessage(up_message, point);clicks::delay(10);
И не сказать бы, чтобы этот код совсем не работал... работает... но не в линейке. Линейка (и только она) не реагирует на эти сообщения никак.
Уважаемое сообщество, есть ли у нас какие-то идеи, наработки и проч., о которых мне следует почитать/посмотреть? Весь интернет уже разрыл -- ничего конкретного.
Заранее спасибо.