PDA

Просмотр полной версии : Проблемы с автокликером в неактивное окно


clyr
22.01.2013, 13:08
Приветствую, коллеги!


Я разрабатываю собственный автокликер, который смог бы рулить не активным, а свернутым (или хотя бы отправленным на задний экран) окном. Для эмуляции нажатия кнопок и кликов мышью я использую собщения 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);



И не сказать бы, чтобы этот код совсем не работал... работает... но не в линейке. Линейка (и только она) не реагирует на эти сообщения никак.

Уважаемое сообщество, есть ли у нас какие-то идеи, наработки и проч., о которых мне следует почитать/посмотреть? Весь интернет уже разрыл -- ничего конкретного.

Заранее спасибо.

Zergatul
22.01.2013, 15:08
Разные защиты могут ставить хуки та твои винапи функции, и просто ничего не делать когда ты их вызываешь по отношению к окну л2. Потом, кликать мышкой по окну л2 не так просто, потому что там директинпут используется, а не события винды.

mira
23.01.2013, 11:41
Разные защиты могут ставить хуки та твои винапи функции, и просто ничего не делать когда ты их вызываешь по отношению к окну л2. Потом, кликать мышкой по окну л2 не так просто, потому что там директинпут используется, а не события винды.

угу там смешано, директинпут обрабатывает сам факт нажатия а оконные мессаги обрабатывает только интерфейс. кнопочки там при нажатии подсвечивают например )