С++ Управление мышью в неактивном окне

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by WALKMAN, 28 Oct 2010.

  1. WALKMAN

    WALKMAN Elder - Старейшина

    Joined:
    30 Dec 2007
    Messages:
    61
    Likes Received:
    2
    Reputations:
    0
    Здравствуйте, у меня возникла потребность управлением мышью, а именно, кликанье мышей в разных местах формы или к примеру по компоненту CppWebBrowser в фоновом режиме.

    Искал информацию по управлению мышью для фонового режима и вот что нашел:

    Code:
    POINT Point;
     Point.x=pos[1]+Form1->Left+66;
     Point.y=pos[0]+Form1->Top+230;
    // перемещаем мышку в координаты
     SendMessage(Form1->Handle,WM_MOVE,0,(LPARAM) &Point);       
    // нажимаем кнопку мышки
     SendMessage(Form1->Handle,WM_LBUTTONDOWN,MK_LBUTTON,(LPARAM) &Point);
    //отпускаем кнопку мышки
     SendMessage(Form1->Handle,WM_LBUTTONUP,MK_LBUTTON,(LPARAM) &Point); 
    Но у меня не работает, что можете подсказать? Ктонибудь делал чтонибудь подобное?
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    mouse_event тебе в помошь
     
  3. WALKMAN

    WALKMAN Elder - Старейшина

    Joined:
    30 Dec 2007
    Messages:
    61
    Likes Received:
    2
    Reputations:
    0
    Думаеш я не пробовал? mouse_event работает если окно активно, а если я хочу например свернуть приложение и смотреть фильм? нажиматься ничего не будет....

    Ключевое слово здесь в фоновом режиме.
     
  4. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    когда отпускаеш кнопку мыши оконная процедура кнопки ловит сообщение WM_LBUTTONUP и пересылает родителю сообщение WM_COMMAND в котором указывается id кнопки код уведомления и хендл кнопки
    Code:
    ...ButtonWindowProc...(hWnd, lParam)
    {
    case WM_LBUTTONUP:
           	WORD wId = WORD(GetMenu(hWnd));
    	SendMessage(GetParent(hWnd), WM_COMMAND,
    		MAKEWPARAM(wId, BN_CLICKED), hWnd);
    }
    
    родительское окно у себя в оконной процедуре имеет код который ждет сообщений WM_COMMAND у которых id это id кнопки
    Code:
    #define BTN_SHOOT 0x41
    
    switch (uMsg)
    {
    case WM_COMMAND:
            switch (LOWORD(wParam))
            {
            case BTN_SHOOT:
                    // ...
            }
    }
    
    мы можем отправить сообщение так как если бы его отправила родительскому окну сама кнопка
    Code:
    #include <windows.h>
    
    int main(int argc, char* argv[])
    {
    	HWND hWnd = FindWindow("SomeWindow", NULL);
    	SendMessage(hWnd, WM_COMMAND, MAKEWPARAM(BTN_SHOOT, BN_CLICKED), 0);
    	return 0;
    }
    
    а для неактивного окна mouse_event ничего не сделает так как винда отправит это сообщение в очередь foreground потока (тоесть потока который имеет активное окно) а не в какое то другое
     
    #4 greki_hoy, 28 Oct 2010
    Last edited: 28 Oct 2010
    1 person likes this.
  5. bad_boy

    bad_boy Elder - Старейшина

    Joined:
    30 Dec 2004
    Messages:
    187
    Likes Received:
    33
    Reputations:
    3
    WALKMAN, mouse_event как раз работает с мышью и не важное есть окно или нет.
     
  6. WALKMAN

    WALKMAN Elder - Старейшина

    Joined:
    30 Dec 2007
    Messages:
    61
    Likes Received:
    2
    Reputations:
    0
    bad_boy, не знаю пробовал на примере таком. Кидал на форму СppWebBrowser, потом нажимал на кнопку, згружался гугл, потом задержка, мышкой переход на позицию, потом mouse_event вниз и вверх (клик) и нажималась ссылка.
    Но когда я сворачивал приложение клик не происходил, и гугл был без изменений
     
  7. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    если так делать то надо слать не форме Form1->Handle а самой кнопке Button1->Handle
     
  8. WALKMAN

    WALKMAN Elder - Старейшина

    Joined:
    30 Dec 2007
    Messages:
    61
    Likes Received:
    2
    Reputations:
    0
    greki_hoy, да для кнопки оно работает в фоновом режиме, но мне нужно управление мышью.
     
  9. WALKMAN

    WALKMAN Elder - Старейшина

    Joined:
    30 Dec 2007
    Messages:
    61
    Likes Received:
    2
    Reputations:
    0
    Спасибо за обьяснение! Думаю это должно сработать... Но я все равно до конца не понимаю. Тоесть здесь как бы "две программы" дочерняя и родитель...

    Можно написать не сложный пример? Ну например программа которая при запуске загружала сайт google.ru и через 2 секунды у примеру "кликала" мышью в координатах ну скажем 100 на 100 от начала компонента браузера.

    Причем фишка программы должна быть в том что нажатие происходило не в зависимости свернуто ли приложение или активно.
     
    #9 WALKMAN, 29 Oct 2010
    Last edited: 29 Oct 2010
  10. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Чего не ясного то.Написали уже все.Если ещё не понял то я обьясню.В винде все гуи конролируется при помощи оконных сообщений, аля WM_messages.Вообщем ТС тебе в мсдн.С окном можно делать что угодно,просто PostMessage+нужное WM_message.
     
    1 person likes this.
  11. WALKMAN

    WALKMAN Elder - Старейшина

    Joined:
    30 Dec 2007
    Messages:
    61
    Likes Received:
    2
    Reputations:
    0
    Дк пробую всеми способами. Уже получилось нажать кнопку в неактивном окне, все ок! Осталась работа с курсором.

    Просто я написал потому как хотелось бы конкретного примера?
     
    #11 WALKMAN, 29 Oct 2010
    Last edited: 29 Oct 2010
  12. WALKMAN

    WALKMAN Elder - Старейшина

    Joined:
    30 Dec 2007
    Messages:
    61
    Likes Received:
    2
    Reputations:
    0
    ура, прошарив интернет у меня всетаки получилось, и так вот как у меня заработало:

    HWND wnd1 = FindWindow(NULL,"Form1");
    POINT pt;
    pt.x=50;
    pt.y=50;

    HWND hwnd2 = ChildWindowFromPoint(wnd1, pt);

    SendMessage (hwnd2, WM_LBUTTONDOWN, 0, MAKELPARAM(50,50));
    SendMessage (hwnd2, WM_LBUTTONUP, 0, MAKELPARAM(50,50));
     
  13. WALKMAN

    WALKMAN Elder - Старейшина

    Joined:
    30 Dec 2007
    Messages:
    61
    Likes Received:
    2
    Reputations:
    0
    Блин, но только нажимаеться на форме на кнопку, тоесть если есть кнопка в тех координатах то она нажимаеться, а если например у меня на форме копмонент CppWebBrowser1 и нужно нажать к примеру на ссылку в коорданатах определенных и на компоненте не нажимает(

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

    Задача впринципе не сложна просто хотелось бы зделать чтобы программу можно было свернуть!
     
    #13 WALKMAN, 30 Oct 2010
    Last edited: 30 Oct 2010