2013-02-19 27 views
5

Winapi kullanarak C# windows formundaki bir mesaj kutusunda 'OK' düğmesine tıklamaya çalışıyorum. Aşağıda üzerinde çalıştığım kod. WINAPI kullanarak mesaj kutusunun 'TAMAM' düğmesine tıklayın 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); 

i hwndChild bir değer elde rağmen

, bu BN_CLICKED tanımıyor. Neyi kaçırdığımı bilmiyorum. herhangi bir yardım?

Başka bir uygulamanın ileti kutusu düğmesini kapatmaya çalışıyorum ve yaptığım şey bu. Ama hala bir şey özlüyorum.

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

C# kullandığınızdan, 'System.Windows.Automation' ad alanını da kullanabilirsiniz. İşte bir örnek [Hesap Makinesi] 'de "7" düğmesine basar (http://stackoverflow.com/questions/14108742/manipulating-the-simple-windows-calculator-using-win32-api-in-c/14111246#14111246). Sadece "Hesap Makinesi" ni "Mesaj" ve "7" yi "Tamam" olarak değiştirin. –

cevap

6

Finallu, bu benim için çalışıyor. İlk başta büyük olasılıkla pencereyi etkinleştirir ve ikinci tıklama düğmesine tıklar.

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

Teşekkürler iletişim kutusundaki düğmeye tıklamakta sorun yaşadım. İki kez tıklamanız için gerekli olan yardımınız bana yardımcı oldu. Dediğin gibi 1. tıkla pencereyi ve ikinci mesajını tıkla. –

11

BN_CLICKED bir ileti değil. BN_CLICKED bildirimi ve wParam düğmesinin kimliğini ve lParam numaralı düğmedeki düğme tutamacını içeren bir WM_COMMAND iletisi göndermeniz gerekir.

düğmeye üst pencere WM_COMMANDmesajının aracılığıyla bu bildirim kodunu alır.

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

Lütfen bana bir örnek verebilir misiniz? Bu konuda iyi bir şey değilim. ve nasıl WM_CLOSE gönder mesajıyla çalışır. – Virus

+2

@Virus: Çünkü "WM_CLOSE", "WM_COMMAND" gibi bir mesajdır. Dikkat ettiğim gibi, BN_CLICKED' bir mesaj değil. Lütfen örneğe bakınız. –