2013-02-19 4 views
5

में WINAPI का उपयोग करके संदेश बॉक्स के 'ओके' बटन पर क्लिक करें, मैं Winapi का उपयोग कर सी # विंडोज़ फॉर्म के संदेश बॉक्स पर 'ओके' बटन पर क्लिक करने की कोशिश कर रहा हूं। नीचे वह कोड है जिस पर मैं काम कर रहा हूं।सी #

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

चूंकि आप सी # का उपयोग कर रहे हैं, तो आप 'System.Windows.Automation' नामस्थान का भी उपयोग कर सकते हैं। यहां एक उदाहरण दिया गया है [[कैलकुलेटर में "7" बटन दबाता है) (http://stackoverflow.com/questions/14108742/manipulating-the-simple-windows-calculator-using-win32-api-in-c/14111246#14111246)। बस "कैलकुलेटर" को "संदेश" और "7" में "ठीक" में बदलें। –

उत्तर

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

धन्यवाद मुझे संवाद के अंदर बटन पर क्लिक करने में समस्या थी। दो बार क्लिक करने के लिए आपका सौजन्य मेरी मदद करता है। जैसा कि आपने कहा था कि पहले सक्रिय विंडो पर क्लिक करें और दूसरा क्लिक करने के लिए संदेश भेजें। –

11

BN_CLICKED एक संदेश नहीं है। आपको BN_CLICKED अधिसूचना और wParam में बटन आईडी और lParam में बटन हैंडल वाला WM_COMMAND संदेश भेजने की आवश्यकता है।

बटन की मूल विंडो 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

+2

@ वायरस: क्योंकि 'WM_CLOSE' एक संदेश है, जैसे' WM_COMMAND'। जैसा कि मैंने नोट किया, 'BN_CLICKED' एक संदेश नहीं है। कृपया उदाहरण देखें। –