Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 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 вне форума   Ответить с цитированием
Старый 22.01.2013, 15:08   #2
Местный
 
Регистрация: 13.12.2007
Сообщений: 126
Сказал Спасибо: 10
Имеет 39 спасибок в 32 сообщенях
Zergatul
По умолчанию

Разные защиты могут ставить хуки та твои винапи функции, и просто ничего не делать когда ты их вызываешь по отношению к окну л2. Потом, кликать мышкой по окну л2 не так просто, потому что там директинпут используется, а не события винды.
Zergatul вне форума   Ответить с цитированием
Старый 23.01.2013, 11:41   #3
Местный
 
Регистрация: 10.08.2010
Сообщений: 634
Сказал Спасибо: 22
Имеет 95 спасибок в 70 сообщенях
mira пока неопределено
По умолчанию

Цитата:
Сообщение от Zergatul Посмотреть сообщение
Разные защиты могут ставить хуки та твои винапи функции, и просто ничего не делать когда ты их вызываешь по отношению к окну л2. Потом, кликать мышкой по окну л2 не так просто, потому что там директинпут используется, а не события винды.
угу там смешано, директинпут обрабатывает сам факт нажатия а оконные мессаги обрабатывает только интерфейс. кнопочки там при нажатии подсвечивают например )
__________________
читернуть бы ништяг
mira вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 03:34.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!