दिलचस्प पोस्ट
एडेप्टर डेटा बदलते समय सूची दृश्य को अपडेट करना कोणीय UI राउटर: माता-पिता निराधार ऑब्जेक्ट के आधार पर बाल राज्य टेम्पलेट तय करें Android सूचीदृश्य के लिए कस्टम फ़ॉन्ट नोडजेएस को एक वैश्विक मॉड्यूल / पैकेज की आवश्यकता है किसी रिश्तेदार पथ जैसे "../include/header.h" शीर्षक के लिए क्या फायदे हैं? क्या मैं एक ही समय में ट्विटर बूटस्ट्रैप और jQuery यूआई का उपयोग कर सकता हूं? जावास्क्रिप्ट में बड़ी संख्याओं से कैसे निपटना है संश्लेषित संपत्ति और चर अंडरस्कोर उपसर्ग के साथ: इसका क्या अर्थ है? मैं पायथन में यूआरएल से छवि डेटा कैसे पढ़ूं? क्यों JSON.stringify प्रोटोटाइप मूल्यों serializing नहीं है? मैं PHP का उपयोग कर एक MySQL डाटाबेस से छवियों को कैसे संग्रह और पुनः प्राप्त कर सकता हूं? सरल सूची आइटम का टेक्स्ट रंग कैसे बदलना है जावा के सिंक्रनाइज़ कीवर्ड का सी # संस्करण? एएसपी.नेट "विशेष" टैग जावास्क्रिप्ट के भीतर रेज़र का उपयोग करना

विशिष्ट कैप्शन / शीर्षक के साथ खिड़कियों को खोजने के लिए मैं कैसे EnumWindows का उपयोग कर सकता हूं?

मैं एक ऐसे आवेदन पर काम कर रहा हूं जो अंततः एक WPF अनुप्रयोग के लिए UI टेस्ट चलाने के लिए एपीआई होगा।

प्रारंभिक परीक्षण के एक बिंदु पर हम काम कर रहे हैं, हमें 2 विंडोज सुरक्षा पॉपअप मिलते हैं। हमारे पास कुछ कोड है जो 10 बार लूप करता है, यह FindWindowByCaption विधि का उपयोग करके पॉपअप में से एक का संभाल लेता है और जानकारी में प्रवेश करती है और ठीक क्लिक करता है

10 में से 9 बार यह काम ठीक है, हालांकि हम कभी-कभी देख रहे हैं कि दौड़ की स्थिति कैसे दिखती है। मेरा संदेह यह है कि लूप तब शुरू होता है जब केवल खिड़कियों में से एक खुली होती है और जानकारी दर्ज करने के बाद दूसरा खुल जाता है और ध्यान केंद्रित करता है; इसके बाद यह सिर्फ अनिश्चित काल तक लटका हुआ है

मैं क्या सोच रहा हूं कि अगर किसी भी कैप्शन के लिए सभी खिड़की का संचालन करने के लिए कोई विधि है, ताकि हम लूप शुरू करने से पहले 2 तक प्रतीक्षा कर सकें।

वेब के समाधान से एकत्रित समाधान "विशिष्ट कैप्शन / शीर्षक के साथ खिड़कियों को खोजने के लिए मैं कैसे EnumWindows का उपयोग कर सकता हूं?"

मूल उत्तर

प्रत्येक विंडो के पाठ पाने के लिए GetWindowText का इस्तेमाल करते हुए, EnumWindows उपयोग करें और सभी खिड़कियों के माध्यम से गणना करें, फिर भी आप चाहें इसे फ़िल्टर करें

 [DllImport("user32.dll", CharSet = CharSet.Unicode)] private static extern int GetWindowText(IntPtr hWnd, StringBuilder strText, int maxCount); [DllImport("user32.dll", CharSet = CharSet.Unicode)] private static extern int GetWindowTextLength(IntPtr hWnd); [DllImport("user32.dll")] private static extern bool EnumWindows(EnumWindowsProc enumProc, IntPtr lParam); // Delegate to filter which windows to include public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam); /// <summary> Get the text for the window pointed to by hWnd </summary> public static string GetWindowText(IntPtr hWnd) { int size = GetWindowTextLength(hWnd); if (size > 0) { var builder = new StringBuilder(size + 1); GetWindowText(hWnd, builder, builder.Capacity); return builder.ToString(); } return String.Empty; } /// <summary> Find all windows that match the given filter </summary> /// <param name="filter"> A delegate that returns true for windows /// that should be returned and false for windows that should /// not be returned </param> public static IEnumerable<IntPtr> FindWindows(EnumWindowsProc filter) { IntPtr found = IntPtr.Zero; List<IntPtr> windows = new List<IntPtr>(); EnumWindows(delegate(IntPtr wnd, IntPtr param) { if (filter(wnd, param)) { // only add the windows that pass the filter windows.Add(wnd); } // but return true here so that we iterate all windows return true; }, IntPtr.Zero); return windows; } /// <summary> Find all windows that contain the given title text </summary> /// <param name="titleText"> The text that the window title must contain. </param> public static IEnumerable<IntPtr> FindWindowsWithText(string titleText) { return FindWindows(delegate(IntPtr wnd, IntPtr param) { return GetWindowText(wnd).Contains(titleText); }); } 

उदाहरण के लिए, शीर्षक में "नोटपैड" के साथ सभी खिड़कियों को प्राप्त करने के लिए:

 var windows = FindWindowsWithText("Notepad"); 

Win32Interop.WinHandles

यह उत्तर काफी लोकप्रिय साबित हुआ है कि मैंने ओएसएसएस परियोजना, Win32Interop.WinHandles को Win32 खिड़कियों के लिए IntPtrs पर एक अमूर्त प्रदान करने के लिए बनाया है। पुस्तकालय का उपयोग, शीर्षक में "नोटपैड" वाली सभी खिड़कियां प्राप्त करने के लिए:

 var allNotepadWindows = TopLevelWindowUtils.FindWindows(wh => wh.GetWindowText().Contains("Notepad")); 
 using HWND = IntPtr; /// <summary>Contains functionality to get all the open windows.</summary> public static class OpenWindowGetter { /// <summary>Returns a dictionary that contains the handle and title of all the open windows.</summary> /// <returns>A dictionary that contains the handle and title of all the open windows.</returns> public static IDictionary<HWND, string> GetOpenWindows() { HWND shellWindow = GetShellWindow(); Dictionary<HWND, string> windows = new Dictionary<HWND, string>(); EnumWindows(delegate(HWND hWnd, int lParam) { if (hWnd == shellWindow) return true; if (!IsWindowVisible(hWnd)) return true; int length = GetWindowTextLength(hWnd); if (length == 0) return true; StringBuilder builder = new StringBuilder(length); GetWindowText(hWnd, builder, length + 1); windows[hWnd] = builder.ToString(); return true; }, 0); return windows; } private delegate bool EnumWindowsProc(HWND hWnd, int lParam); [DllImport("USER32.DLL")] private static extern bool EnumWindows(EnumWindowsProc enumFunc, int lParam); [DllImport("USER32.DLL")] private static extern int GetWindowText(HWND hWnd, StringBuilder lpString, int nMaxCount); [DllImport("USER32.DLL")] private static extern int GetWindowTextLength(HWND hWnd); [DllImport("USER32.DLL")] private static extern bool IsWindowVisible(HWND hWnd); [DllImport("USER32.DLL")] private static extern IntPtr GetShellWindow(); } 

और यहाँ कुछ कोड है जो इसका उपयोग करता है:

 foreach(KeyValuePair<IntPtr, string> window in OpenWindowGetter.GetOpenWindows()) { IntPtr handle = window.Key; string title = window.Value; Console.WriteLine("{0}: {1}", handle, title); } 

मुझे यह कोड मिला http://www.tcx.be/blog/2006/list-open-windows/

अगर आपको इसका उपयोग करने के लिए मदद की आवश्यकता है, तो मुझे बताएं, मैंने इसे समझ लिया