2011-01-17 10 views
3

Ich versuche, ein Klickereignis in einer Anwendung von Drittanbietern zu generieren. Am Anfang habe ich versucht einen Klick im Rechner zu simulieren. Hier ist der Code“Wie bekomme ich den Handle der 3rd Party Application Button mit C#?

IntPtr hwnd = IntPtr.Zero; 
IntPtr hwndChild = IntPtr.Zero; 
//Get a handle for the Calculator Application main window 
hwnd = FindWindow(null, "Calculator"); 

hwndChild = FindWindowEx(hwnd, IntPtr.Zero, "Button", "1"); 

//send BN_CLICKED message 
SendMessage(hwndChild, BM_CLICK, IntPtr.Zero, IntPtr.Zero); 

Aber mit diesem Code, den ich nicht den Griff der Taste zu bekommen. Könnte jemand bitte helfen. Gibt es eine andere Art und Weise auf eine Schaltfläche klicken Sie auf Applikationen von Drittanbietern zu simulieren?

Dank

.
+1

ersetzt zu arbeiten? – Flipster

+0

Ich denke, Flip ist korrekt, wie Sie es als eine Fensternachricht senden müssen, wenn Sie es leicht tun möchten, können Sie Spy ++ verwenden, um die Namen und sogar spezifische Handles zu finden, die dann in Ihren Code eingefügt werden. –

+0

@FlipScript: Ich denke, sie arbeiten beide, nicht wahr? – Mehrdad

Antwort

1

Es begann, als ich

public const uint BM_CLICK = 0x00F5; 

mit

public const uint WM_LBUTTONDOWN = 0x0201; 
public const uint WM_LBUTTONUP = 0x0202; 

und verwendet

nicht WM_CLICK BM_CLICK Sollte
SendMessage(buttonHandle, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero); 
SendMessage(buttonHandle, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero); 
0

Erste SPY Verwendung ++ zu finden, dass eine Schaltfläche mit Griff ist.

In einigen Fällen sind die Steuerelemente, die Schaltfläche aussieht, kann grafische Kontrolle. der Unterschied ist die grafische Steuerung nicht Handle, aber die Windows-Steuerelement wird Handle haben. Wenn das Steuer über gültige Handle.Then verwenden FindWindowEx

Auch Eltern Fenstergriff (ich glaube ersten Parameter, Vielleicht haben Sie GetWindow() verwenden, mit der Beschriftung) geben

klicken Sie dann auf Nachricht senden.

1

Ihr allgemeiner Ansatz ist richtig, aber es gibt zwei mögliche Probleme mit Ihrem Code:

  1. FindWindowEx findet nur direkte Kinder des angegebenen Fensters. Es ist möglich, dass die Taschenrechner-Schaltflächen in einem Containerfenster angeordnet sind, das ein Kind des Hauptfensters ist, so dass die Schaltfläche kein direktes Kind des Hauptfensters sein würde.

  2. Die Dokumentation für BM_CLICK besagt, dass es simuliert einen Klick durch Senden von Maus nach unten und oben Nachrichten und daher müssen Sie möglicherweise das übergeordnete Fenster vor dem Senden dieser Nachricht aktivieren.

+0

Ist diese Verwendung korrekt? Ich erkläre dies am Anfang der Öffentlichkeit const uint BM_CLICK = 0x00F5; – Nikil

0

Wenn Sie nicht den Griff der Taste haben, können Sie Mausklick auf Koordinaten emulieren:

class User32 
{ 
    [Flags] 
    public enum MouseEventFlags 
    { 
     LEFTDOWN = 0x00000002, 
     LEFTUP = 0x00000004, 
     MIDDLEDOWN = 0x00000020, 
     MIDDLEUP = 0x00000040, 
     MOVE = 0x00000001, 
     ABSOLUTE = 0x00008000, 
     RIGHTDOWN = 0x00000008, 
     RIGHTUP = 0x00000010 
    } 

    [DllImport("user32.dll")] 
    public static extern bool SetCursorPos(int X, int Y); 

    [DllImport("user32.dll")] 
    public static extern void mouse_event(uint dwFlags, 
            uint dx, 
            uint dy, 
            uint dwData, 
            int dwExtraInfo); 

    [DllImport("user32.dll")] 
    public static extern void mouse_event(uint dwFlags, 
            uint dx, 
            uint dy, 
            uint dwData, 
            UIntPtr dwExtraInfo); 
} 

class Program 
{ 
    static void Main() 
    { 
     User32.SetCursorPos(25, 153); 
     User32.mouse_event((uint)User32.MouseEventFlags.LEFTDOWN, 25, 153, 0, 0); 
     User32.mouse_event((uint)User32.MouseEventFlags.LEFTUP, 25, 153, 0, 0); 
    } 
} 

Aber Funktion SetCursorPos gesetzt Cursorposition in globalen Koordinaten des Bildschirms, Faust so shoud Sie Holen Sie sich die Möglichkeit eines Drittanbieter-Anwendung Fenster.

+0

Danke, aber ich bekomme den Griff. – Nikil