कोड आप कोशिश कर रहे हैं उन्हें पहचान करने के लिए अलग-अलग बटन के कैप्शन पर निर्भर करता है। उदाहरण के लिए, यह "1" बटन के लिए एक संभाल पाने के लिए निम्नलिखित कोड का उपयोग करता है:
hwndChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, "Button", "1");
कौन सा विंडो वर्ग के नाम के लिए "बटन" निर्दिष्ट करती है और "1" खिड़की के नाम के लिए (बटन के मामले में, यह बटन पर प्रदर्शित कैप्शन टेक्स्ट जैसा ही है)।
यह कोड विंडोज एक्सपी (और पिछले संस्करणों) के तहत ठीक काम करता है, जहां कैलक्यूलेटर बटन को टेक्स्ट कैप्शन के साथ पहचाना जाता था। "1" बटन में "1" का विंडो नाम था, और इस प्रकार "1" बटन के कैप्शन के रूप में प्रदर्शित किया गया था।
हालांकि, ऐसा लगता है कि विंडोज 7 के तहत चीजें बदली गई हैं (संभवतः विस्टा के तहत भी, हालांकि मैं इसे सत्यापित नहीं कर सकता क्योंकि मुझे इस तरह की प्रणाली तक पहुंच नहीं है)। कैलक्यूलेटर विंडो की जांच करने के लिए Spy ++ का उपयोग करने से पुष्टि होती है कि "1" बटन में अब "1" का विंडो नाम नहीं है। वास्तव में, इसमें खिड़की का नाम बिल्कुल नहीं है; कैप्शन न्यूल है। संभवतः, कैलकुलेटर के नए फैंसी लुक के लिए आवश्यक है कि बटन कस्टम खींचे जाए, इस प्रकार कैप्शन अब यह आवश्यक नहीं है कि कौन सा बटन किस कार्य से मेल खाता हो। कस्टम पेंटिंग दिनचर्या आवश्यक कैप्शन ड्राइंग का ख्याल रखती है।
चूंकि आपके द्वारा निर्दिष्ट विंडो पाठ के साथ कोई बटन नहीं मिल सकता है, इसलिए 0 (NULL
) का मान विंडो हैंडल के लिए वापस किया जाता है।
documentation for the FindWindowEx
function इंगित करता है कि आप lpszWindow
पैरामीटर के लिए NULL
निर्दिष्ट कर सकते हैं, लेकिन यह है कि इस वसीयत, ज़ाहिर है, मैच निर्दिष्ट वर्ग के सभी खिड़कियां। शायद इस मामले में आप जो चाहते हैं उसे नहीं, क्योंकि कैलकुलेटर ऐप में बटन का एक गुच्छा है।
मुझे एक अच्छा कामकाज नहीं पता है। कैलक्यूलेटर को इस तरह से "स्वचालित" होने के लिए डिज़ाइन नहीं किया गया था, और माइक्रोसॉफ्ट ने कभी गारंटी नहीं दी कि वे अपनी आंतरिक कार्यप्रणाली नहीं बदलेंगे। यह एक जोखिम है जिसे आप अन्य अनुप्रयोगों की खिड़कियों के साथ गड़बड़ करने के लिए इस दृष्टिकोण का उपयोग करते हैं।
संपादित करें: कोड आप जुड़े हैं भी, एक और काफी गंभीर तरह से गलत है भी विंडोज के पिछले संस्करणों पर। यह hwnd
वैरिएबल int
के रूप में IntPtr
के रूप में घोषित करता है। चूंकि एक विंडो हैंडल पॉइंटर है, इसलिए आपको इसे हमेशा IntPtr
प्रकार के रूप में स्टोर करना चाहिए। यह FindWindowEx
फ़ंक्शन कॉल में बदसूरत कलाकारों को भी ठीक करता है जो लाल झंडे भेजना चाहिए था।
आपको SendMessage
की घोषणा को ठीक करने की भी आवश्यकता होगी ताकि इसका पहला पैरामीटर IntPtr
प्रकार का हो।
कोड इस तरह लिखा गया है चाहिए:
IntPtr hwnd = IntPtr.Zero;
IntPtr hwndChild = IntPtr.Zero;
//Get a handle for the Calculator Application main window
hwnd = FindWindow(null, "Calculator");
if(hwnd == IntPtr.Zero)
{
if(MessageBox.Show("Couldn't find the calculator" +
" application. Do you want to start it?",
"TestWinAPI",
MessageBoxButtons.YesNo) == DialogResult.Yes)
{
System.Diagnostics.Process.Start("Calc");
}
}
else
{
//Get a handle for the "1" button
hwndChild = FindWindowEx(hwnd, IntPtr.Zero, "Button", "1");
//send BN_CLICKED message
SendMessage(hwndChild, BN_CLICKED, 0, IntPtr.Zero);
//Get a handle for the "+" button
hwndChild = FindWindowEx(hwnd, IntPtr.Zero, "Button", "+");
//send BN_CLICKED message
SendMessage(hwndChild, BN_CLICKED, 0, IntPtr.Zero);
//Get a handle for the "2" button
hwndChild = FindWindowEx(hwnd, IntPtr.Zero, "Button", "2");
//send BN_CLICKED message
SendMessage(hwndChild, BN_CLICKED, 0, IntPtr.Zero);
//Get a handle for the "=" button
hwndChild = FindWindowEx(hwnd, IntPtr.Zero, "Button", "=");
//send BN_CLICKED message
SendMessage(hwndChild, BN_CLICKED, 0, IntPtr.Zero);
}
आप विंडोज के किस संस्करण को चल रहे हैं? –
यदि आपको पी/इनवॉक के साथ कोई समस्या हो रही है, तो अपनी घोषणा 'DllImport' विशेषता के साथ पोस्ट करें। अगर आपको कुछ कोड में कोई समस्या हो रही है, तो उस कोड को पोस्ट करें जो काम नहीं कर रहा है। – Gabe
@ कोडीग्रे मैं विंडोज 7 पेशेवर हूं। – teenup