2013-07-19 13 views
5

Ich habe ein Projekt, bei dem mehrere Fensterclients geöffnet werden und dann Mausklicks in jedem dieser Prozesse simuliert werden. Ich konnte erfolgreich eine Nachricht an mehrere Notepad-Instanzen senden, indem ich die Win32-API und SendMessage verwendete. Der Code, der für mich arbeitet, ist wie folgt:Web Automation Maus Klicken Sie auf

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"); 
        } 
       } 
      } 

Diese für jede Instanz „Test“ sendet Ich habe von Notepad geöffnet, egal wie viele. Wie Sie sehen können, durchläuft ich jede Instanz eines Prozesses und schleift einfach die Nachricht. War gar nicht schwer ...

Das Endziel ist nicht Notepad, sondern eher die Microsoft-Erweiterung Awesomium. Ich habe den Fenstergriff und dann den Klassennamen des Kindes (Awesomium) abgerufen, nämlich Chrome_RenderWidgetHostHWND. Von dort habe ich versucht, Mausereignisse zu senden, indem ich die Variablentypen in Sendmessage umstrukturiere und lParam, das vom System gelesen werden kann. Hier ist der Code:

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

einige Beispiele Verwendung Ich fand ich die lParam über diese montieren:

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

Ich verwende die globalen Maus Haken Pressetermine in allen untergeordneten Fenster zu erfassen, und wenn ich Drücken Sie meine Taste, um den Prozess zu durchlaufen und klicken Sie, es wird überhaupt nichts gesendet. Ich weiß, dass ich hier etwas Dummes mache, was dazu führt, dass die Mausklicks nicht gesendet werden. In jedem Fall ist hier die endgültige Code-Struktur, die ich habe. Irgendwelche Ratschläge oder Tipps würden geschätzt werden. Vielen Dank.

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

Nachdem ich einige Fehler mit meinem Code erkannt hatte, habe ich mich endlich in WinInspector gegraben und alle Befehle abgerufen, die für einen Mausklick erforderlich waren. Ich bin so ein Noob. Für alle in der Zukunft, hier sind die Nachrichten benötigt, um einen Klick auf Awesomium mit Win32 zu aktivieren, am wahrscheinlichsten ist es das gleiche für alle. WM_PARENTNOTIFY, WM_MOUSEACVTIVATE, WM_LBUTTONDOWN. Die Reihe dieser drei Befehle benachrichtigt den Elternteil, dass der Benutzer die Maus aktiviert hat, führt dann einen kurzen Hittest durch und drückt schließlich den linken Knopf. Hoffe, das hilft jemandem. – user2578424

+3

Sie sollten eine Antwort geben und dann akzeptieren. – Xcelled194

Antwort

1

Oder Sie könnten SendInput stattdessen verwenden, die korrekt in Gegenwart von Maus Haken arbeiten; Ihre Lösung (Nachrichten direkt buchen) wird nicht.

Noch wichtiger, wenn der Prozess die Aktivierung ablehnt (d. H. Wenn das Ziel 0 von WM_MOUSEACTIVATE zurückgibt), wird WM_LBUTTONDOWN nicht gesendet.

Verwandte Themen