Показать сообщение отдельно
Старый 22.01.2013, 13:08   #1
Пользователь
 
Регистрация: 10.12.2007
Сообщений: 54
Сказал Спасибо: 4
Имеет 46 спасибок в 16 сообщенях
clyr пока неопределено
Сообщение Проблемы с автокликером в неактивное окно

Приветствую, коллеги!


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

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

Заранее спасибо.
clyr вне форума   Ответить с цитированием