2013-07-19 12 views
5

Mam projekt, który obejmuje otwieranie wielu klientów okna, a następnie symulowanie kliknięć myszy w ramach każdego z tych procesów. Udało mi się wysłać wiadomość do wielu wystąpień Notatnika za pomocą Win32 API i SendMessage. Kod, który pracuje dla mnie jest następująca:Web Automation Mouse Kliknięcie

Process[] notepads = Process.GetProcessesByName("notepad"); 
      foreach (Process proc in notepads) 
      { 
        IntPtr handle = proc.Handle; 
        IntPtr child = FindWindowEx(proc.MainWindowHandle, new IntPtr(0), "Edit", null); 
        if (child != null) 
        { 
         MessageBox.Show("Child was found, sending text"); 
         SendMessage(child, 0x000C, 0, "test"); 
        } 
       } 
      } 

Ten wysyła „test” do każdej instancji Otworzyłem Notatnika, bez względu na to ile. Jak widzisz, robię iterację po każdej instancji procesu i po prostu zapętlając wiadomość. Nie było wcale trudne ...

Ostatecznym celem nie jest Notatnik, a raczej rozszerzenie Microsoft Awesomium. Pobrałem uchwyt okna, a następnie nazwę klasy potomnej (Awesomium), która jest Chrome_RenderWidgetHostHWND. Stamtąd próbowałem wysyłać zdarzenia myszy przez refaktoryzację typów zmiennych w Sendmessage w celu ich zsynchronizowania i lParam do odczytania przez system. Tutaj jest to, że kod:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
     static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 

Korzystanie kilka przykładów znalazłem zmontować lParam poprzez to:

int x = 834; 
int y = 493; 
IntPtr lParam = (IntPtr)((y << 16) | x); 
IntPtr wParam = IntPtr.Zero; 

Używam haki Globalny myszy do wykrywania zdarzeń Press We wszystkich okien potomnych, a kiedy naciśnij przycisk, aby powtórzyć proces i kliknij, nic nie jest wysyłane. Wiem, że robię coś głupiego, co powoduje, że kliknięcia myszą nie są wysyłane. W każdym razie tutaj jest ostateczna struktura kodu, którą mam. Wszelkie porady lub wskazówki będą mile widziane. Dzięki.

private void button2_Click(object sender, EventArgs e) 
    { 
     Process[] notepads = Process.GetProcessesByName("client"); 
     foreach (Process proc in notepads) 
     { 
       IntPtr handle = proc.Handle; 
       string mine = Convert.ToString(proc); 
       MessageBox.Show(mine); 
       IntPtr child = FindWindowEx(proc.MainWindowHandle, new IntPtr(0), "Chrome_RenderWidgetHostHWND", null); 
       if (child != null) 
       { 
       int x = 834; 
       int y = 493; 
       IntPtr lParam = (IntPtr)((y << 16) | x); 
       IntPtr wParam = IntPtr.Zero; 
       SendMessage(child, 0x201, wParam, lParam); 
       SendMessage(child, 0x202, wParam, lParam); 
       } 
      } 
     } 
+0

Realizując kilka błędów za pomocą mojego kodu, w końcu wkopałem się w WinInspector i odzyskałem wszystkie polecenia potrzebne do zainicjowania kliknięcia myszą. Jestem takim noobem. Dla każdego w przyszłości, tutaj są wiadomości potrzebne do aktywacji kliknięcia na Awesomium przy użyciu Win32, najprawdopodobniej jest to takie samo dla wszystkich. WM_PARENTNOTIFY, WM_MOUSEACVTIVATE, WM_LBUTTONDOWN. Seria tych trzech poleceń powiadomi rodzica, że ​​użytkownik aktywował mysz, następnie wykonuje krótką, najmocniejszą akcję, a następnie naciska lewy przycisk. Mam nadzieję, że to pomaga komuś. – user2578424

+3

Powinieneś udzielić odpowiedzi, a następnie ją zaakceptować. – Xcelled194

Odpowiedz

1

Albo można użyć SendInput zamiast, który będzie działać prawidłowo w obecności haków myszy; twoje rozwiązanie (bezpośredniego publikowania wiadomości) nie będzie.

Co ważniejsze, jeśli proces odrzuci aktywację (tj. Jeśli cel zwróci 0 z WM_MOUSEACTIVATE), WM_LBUTTONDOWN nie zostanie wysłany.

Powiązane problemy