2013-02-19 8 views
5

Sto provando a fare clic sul pulsante "OK" in una finestra di messaggio di Windows C form utilizzando winapi. Di seguito è riportato il codice su cui sto lavorando.Fare clic sul pulsante "OK" della finestra di messaggio che utilizza 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); 

benchè ottenga un valore in hwndChild, esso non riconosce BN_CLICKED. Non sono sicuro di cosa mi manchi. qualsiasi aiuto?

Sto cercando di chiudere il pulsante della finestra di messaggio di un'altra applicazione e questo è quello che sto facendo. Ma mi manca ancora qualcosa.

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

Poiché si utilizza C#, è possibile utilizzare lo spazio dei nomi 'System.Windows.Automation'. Ecco un esempio che [spinge il pulsante "7" in Calcolatrice] (http://stackoverflow.com/questions/14108742/manipulating-the-simple-windows-calculator-using-win32-api-in-c/14111246#14111246). Basta cambiare "Calcolatrice" in "Messaggio" e "7" in "OK". –

risposta

6

Finallu, questo funziona per me. Il primo clic probabilmente attiva la finestra e il secondo clic fa clic sul pulsante.

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

Grazie ho avuto problemi a fare clic sul pulsante all'interno della finestra di dialogo. Il tuo sollution per fare clic due volte mi ha aiutato. Come hai detto, il primo clic attiva la finestra e il secondo invia il messaggio per fare clic. –

11

BN_CLICKED non è un messaggio. È necessario inviare un messaggio WM_COMMAND contenente la notifica BN_CLICKED e l'ID del pulsante nello wParam e l'handle del pulsante in lParam.

La finestra padre del pulsante riceve questo codice di notifica tramite il messaggio 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

Potete per favore darmi un esempio. Non sono esperto di questo. e come mai WM_CLOSE funziona con il messaggio di invio. – Virus

+2

@Virus: Perché 'WM_CLOSE' è un messaggio, proprio come' WM_COMMAND'. Come ho notato, 'BN_CLICKED' non è un messaggio. Si prega di vedere l'esempio. –

Problemi correlati