2013-02-19 29 views
5

Tôi đang cố gắng nhấp vào nút 'OK' trên hộp thông báo của biểu mẫu C# windows bằng cách sử dụng winapi. Dưới đây là mã mà tôi đang làm việc.Nhấp vào nút 'OK' của hộp thư bằng cách sử dụng WINAPI trong 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); 

Mặc dù tôi nhận được một giá trị trong hwndChild, nó không nhận ra BN_CLICKED. Tôi không chắc mình đang thiếu gì. bất kỳ giúp đỡ?

Tôi đang cố gắng đóng nút hộp thư của một ứng dụng khác và đây là những gì tôi đang làm. Nhưng, tôi vẫn còn thiếu cái gì đó.

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

Vì bạn đang sử dụng C#, bạn cũng có thể sử dụng không gian tên 'System.Windows.Automation'. Dưới đây là ví dụ cho biết [nhấn nút "7" trong Máy tính] (http://stackoverflow.com/questions/14108742/manipulating-the-simple-windows-calculator-using-win32-api-in-c/14111246#14111246). Chỉ cần thay đổi "Máy tính" thành "Tin nhắn" và "7" thành "OK". –

Trả lời

6

Finallu, điều này phù hợp với tôi. Lần nhấp đầu tiên có thể kích hoạt cửa sổ và nhấp chuột thứ hai sẽ nhấp vào nút.

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

Cảm ơn tôi đã gặp sự cố khi nhấp vào nút bên trong hộp thoại. Thận trọng của bạn để bấm hai lần đã giúp tôi. Như bạn đã nói 1st click kích hoạt cửa sổ và thứ hai gửi tin nhắn để click. –

11

BN_CLICKED không phải là một thông báo. Bạn cần gửi tin nhắn WM_COMMAND chứa thông báo BN_CLICKED và ID nút trong số wParam và nút xử lý trong lParam.

Cửa sổ chính của nút nhận mã thông báo này thông qua tin nhắn 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

Bạn có thể cho tôi một ví dụ không. Tôi không thành thạo với điều này. và cách WM_CLOSE hoạt động với tin nhắn gửi đi. – Virus

+2

@Virus: Bởi vì 'WM_CLOSE' là một thư, giống như' WM_COMMAND'. Như tôi đã lưu ý, 'BN_CLICKED' không phải là một thông báo. Vui lòng xem ví dụ. –

Các vấn đề liên quan