2013-02-19 76 views
5

我想單擊使用winapi的C#窗體消息框的「確定」按鈕。以下是我正在處理的代碼。使用WINAPI在c#中單擊'OK'按鈕的消息框。

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

雖然我得到了hwndChild的值,它是不承認BN_CLICKED。 我不知道我錯過了什麼。任何幫助?

我想關閉另一個應用程序的消息框按鈕,這就是我正在做的。但是,我仍然錯過了一些東西。

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

由於您使用的是C#,所以您最好使用'System.Windows.Automation'命名空間。這裏是一個例子,[推動計算器中的「7」按鈕](http://stackoverflow.com/questions/14108742/manipulating-the-simple-windows-calculator-using-win32-api-in-c/14111246#14111246 )。只需將「計算器」更改爲「消息」並將「7」更改爲「確定」即可。 – 2013-02-19 18:04:52

回答

6

Finallu,這對我的作品。 首先點擊可能會激活窗口,然後點擊按鈕。

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

謝謝我有問題點擊對話框中的按鈕。你點擊兩次的溶劑幫助了我。正如你所說的第一次點擊激活窗口,然後發送消息點擊。 – 2014-12-12 07:20:41

11

BN_CLICKED不是消息。您需要發送WM_COMMAND消息,其中包含BN_CLICKED通知和wParam中的按鈕ID以及lParam中的按鈕處理。

該按鈕的父窗口通過WM_COMMAND消息收到此通知代碼 。

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

你能舉個例子嗎?我對此不甚瞭解。以及WM_CLOSE如何與發送消息一起工作。 – Virus 2013-02-19 16:23:22

+2

@Virus:因爲'WM_CLOSE'是一條消息,就像'WM_COMMAND'一樣。正如我所指出的,'BN_CLICKED'不是一條消息。請看例子。 – 2013-02-19 16:36:30

相關問題