2013-02-19 3 views
5

Ich versuche, klicken Sie auf "OK" -Taste in einem Meldungsfeld von C# Windows-Formular mit WinAPI. Unten ist der Code, an dem ich arbeite.Klicken Sie auf "OK" -Schaltfläche des Meldungsfelds mit WINAPI in C#

private const int WM_CLOSE = 16; 
private const int BN_CLICKED = 245; 

[DllImport("user32.dll", CharSet=CharSet.Auto)] 
     public static extern int SendMessage(int hWnd, int msg, int wParam, IntPtr lParam); 

[DllImport("user32.dll", SetLastError = true)] 
     public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle); 

//this works 
hwnd = FindWindow(null, "Message"); 
if(hwnd!=0) 
     SendMessage(hwnd, WM_CLOSE, 0, IntPtr.Zero); 

//this doesn't work. 
hwndChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, "Button", "ok"); 
SendMessage((int)hwndChild, BN_CLICKED, 0, IntPtr.Zero); 

Obwohl ich einen Wert in hwndChild bekommen, ist es nicht BN_CLICKED erkennen. Ich bin mir nicht sicher was ich vermisse. irgendeine Hilfe?

Ich versuche, die Message-Box-Taste einer anderen Anwendung zu schließen, und das ist, was ich tue. Aber mir fehlt noch etwas.

IntPtr hwndChild = IntPtr.Zero; 
hwndChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero,' '"Button", "OK"); 
SendMessage((int)hwndChild, WM_COMMAND, (BN_CLICKED '<<16) | IDOK, hwndChild); 
+0

Da Sie C# verwenden, können Sie auch den Namensraum 'System.Windows.Automation' verwenden. Hier ist ein Beispiel, dass [drückt die "7" -Taste in Rechner] (http://stackoverflow.com/questions/14108742/manipulating-the-simple-windows-calculator-using-win32-api-in-c/14111246#14111246). Ändern Sie einfach "Calculator" zu "Message" und "7" zu "OK". –

Antwort

6

Finallu, das funktioniert für mich. Erster Klick aktiviert wahrscheinlich das Fenster und ein zweiter Klick klickt auf die Schaltfläche.

SendMessage(btnHandle, WM_LBUTTONDOWN, 0, 0); 
SendMessage(btnHandle, WM_LBUTTONUP, 0, 0); 
SendMessage(btnHandle, WM_LBUTTONDOWN, 0, 0); 
SendMessage(btnHandle, WM_LBUTTONUP, 0, 0); 
+0

Danke, ich hatte Probleme, auf den Button im Dialog zu klicken. Ihre Lösung, zweimal zu klicken, hat mir geholfen. Wie du schon sagtest 1. Klick Fenster aktivieren und zweite Nachricht senden um zu klicken. –

11

BN_CLICKED ist keine Nachricht. Sie müssen eine WM_COMMAND-Nachricht mit der BN_CLICKED Benachrichtigung und der Schaltflächen-ID in der wParam und die Schaltfläche in lParam senden.

Das übergeordnete Fenster der Schaltfläche empfängt diesen Benachrichtigungscode über die WM_COMMAND-Nachricht.

private const uint WM_COMMAND = 0x0111; 
private const int BN_CLICKED = 245; 
private const int IDOK = 1; 

[DllImport("user32.dll", CharSet=CharSet.Auto)] 
     public static extern int SendMessage(IntPtr hWnd, uint msg, int wParam, IntPtr lParam); 

[DllImport("user32.dll", SetLastError = true)] 
     public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle); 

SendMessage(hwndChild, WM_COMMAND, (BN_CLICKED << 16) | IDOK, hwndChild); 
+0

Können Sie mir bitte ein Beispiel geben. Ich bin nicht damit vertraut. und wie kommt es, WM_CLOSE arbeitet mit senden Nachricht. – Virus

+2

@ Virus: Weil 'WM_CLOSE' eine Nachricht ist, genau wie' WM_COMMAND'. Wie ich festgestellt habe, ist 'BN_CLICKED' keine Nachricht. Bitte beachten Sie das Beispiel. –

Verwandte Themen