दिलचस्प पोस्ट
जावा में, मैं बाइनरी प्रारूप में एक पूर्णांक स्थिरता को परिभाषित कर सकता हूँ? कैसे json को संभालना है जो स्ट्रिंग और स्ट्रिंग सरणी को देता है? मक्खी पर एक php ऑब्जेक्ट में एक नई विधि कैसे जोड़ें? मक्खी पर / रेस / ड्रॉएबल / लिखें? एक स्थानीय फाइल सिस्टम पर `लिखने (2)` परमाणुता डिवीजन रिटर्न शून्य क्या मैं एक "व्यू" एक पायथन सूची पर बना सकता हूं? मैं जासूस ++ चाहता हूं लेकिन मेरे पास विजुअल स्टूडियो नहीं है शीट आदेश में शीट नाम प्राप्त करने के लिए एक्सेल ऑलेडीबी का उपयोग करना जावास्क्रिप्ट करी: व्यावहारिक अनुप्रयोग क्या हैं? मैं जावा में विधि का निष्पादन कैसे करता हूं? गतिशील रूप से एक स्थानीय चर बनाने के लिए कैसे? अगर मैं एक ही कक्षा में दो तरीकों को सिंक्रनाइज़ करता हूं, तो क्या वे एक साथ चल सकते हैं? एक्सएमएल लेआउट में एंड्रॉइड के <मर्ज> टैग का उद्देश्य क्या है? पैसे से निपटने के लिए क्या मुझे NSDecimalNumber का उपयोग करना चाहिए?

विंडोज: सभी दृश्य खिड़कियों की सूची कैसे प्राप्त करें?

(सभी मतलब से प्रासंगिक प्रौद्योगिकी के साथ फिर से टैग करें: मुझे नहीं पता कि वे कौन हैं 🙂

मैं शायद अधिक विस्तृत प्रश्नों के साथ बाद में विशिष्ट विवरणों के बारे में बताऊंगा, लेकिन अभी के लिए मैं "बड़ी तस्वीर" समझने की कोशिश कर रहा हूं: मैं विंडोज पर "वास्तविक दृश्य विंडो" को मापने का एक तरीका तलाश रहा हूं। "वास्तविक दृश्य खिड़की" से मेरा मतलब है कि: एक उपयोगकर्ता क्या "विंडो" कहता है मुझे इन सभी दृश्यमान खिड़कियों की सूची प्राप्त करने की ज़रूरत है, जेड-ऑर्डर में

ध्यान दें कि मुझे वास्तव में ऐसा करने की ज़रूरत है मैंने ओएस एक्स (जहां यह करने के लिए एक वास्तविक सिरदर्द है, खासकर अगर आप ओएस एक्स 10.4 का समर्थन करना चाहते हैं, क्योंकि ओएस एक्स में सुविधाजनक विंडोज़ एपीआई नहीं है) पर पहले से ही किया है और अब मुझे इसे विंडोज़ के तहत करना है।

यहाँ एक उदाहरण है, मान लीजिए कि स्क्रीन पर तीन दृश्य विंडो हैं, जैसे:

+------------------------------------------+ | | | +=============+ | | | | | | | A +--------------------------+ | | | | | C | | B | | | +--------------------------+ | | | | +-----------| |----------------+ | | +-------------+ 

फिर मुझे इस तरह एक सूची वापस करने की आवश्यकता है:

  windows B is at (210,40) windows A is at (120,20) windows C is at (0,0) 

तब अगर उपयोगकर्ता (या ओएस) सामने की ओर विंडो A लाता है, तो वह हो जाता है:

  +------------------------------------------+ | | | +=============+ | | | | | | | A |---------------------+ | | | | | C | | B | | | |---------------------+ | | | | +-----------| |----------------+ | | +-------------+ 

और मुझे (आदर्श रूप से) एक कॉलबैक मिल रहा है जो मुझे यह देता है:

 windows A is at (120,20) windows B is at (210,40) windows C is at (0,0) 

ओएस एक्स के तहत यह करने के लिए आश्चर्यजनक अजीब हैक्स का उपयोग करने की आवश्यकता है (जैसे कि उपयोगकर्ता "सहायक उपकरण के लिए पहुँच सक्षम करें" चालू करने के लिए !), लेकिन मैंने इसे ओएस एक्स के तहत किया है और यह काम करता है (ओएस एक्स के तहत, मैंने नहीं किया कॉलबैक प्राप्त करने के लिए हर बार कुछ विंडो में परिवर्तन होने का प्रबंधन होता है, इसलिए मैं मतदान करता हूं, लेकिन मुझे यह काम करने के लिए मिला)।

अब मैं इसे विंडोज के तहत करना चाहता हूं (मैं वास्तव में करता हूं, इसके बारे में कोई सवाल नहीं) और मुझे कुछ प्रश्न हैं:

  • क्या यह किया जा सकता है?

  • वहाँ अच्छी तरह से दस्तावेज विंडोज एपीआई (और उनके ऐनक के अनुसार काम) कर रहे हैं कि ऐसा करने की अनुमति?

  • क्या हर बार किसी विंडो में कॉलबैक दर्ज करना आसान है? (यदि इसे पुनः आकार दिया गया है, स्थानांतरित किया गया है, वापस / सामने लाया गया है या एक नई विंडो पॉप-अप आदि)

  • क्या हो सकता है?

मुझे पता है कि यह प्रश्न विशिष्ट नहीं है, यही वजह है कि मैंने अपनी समस्या का स्पष्ट रूप से स्पष्ट रूप से वर्णन करने की कोशिश की है (जिसमें अच्छा एएससीआईआई कला शामिल है जिसके लिए आप इसका जवाब दे सकते हैं): अब मैं "बड़ी तस्वीर" को देख रहा हूं। मुझे यह जानना है कि ऐसा करने से विंडोज के अंतर्गत शामिल होता है

बोनस प्रश्न: कल्पना करें कि आपको एक छोटी सी फाइल लिखने की ज़रूरत होगी। एक्सचेंज ने खिड़कियों के नाम / स्थिति / आकार को एक अस्थायी फ़ाइल में लिखना हर बार स्क्रीन पर एक विंडो में परिवर्तन किया है, इस तरह का कार्यक्रम आपकी पसंद की भाषा में कितना समय तक होगा और कितनी देर तक क्या आपको इसे लिखना होगा?

(एक बार फिर, मैं यह समझने की कोशिश कर रहा हूं कि काम पर क्या है)

वेब के समाधान से एकत्रित समाधान "विंडोज: सभी दृश्य खिड़कियों की सूची कैसे प्राप्त करें?"

शीर्ष-स्तरीय खिड़कियों की गणना करने के लिए, आपको गेटटोपवंडो / गेटनडेड विन्डो की बजाय ऐनविन विंडों का उपयोग करना चाहिए, चूंकि EnumWindows विंडो स्थिति का एक निरंतर दृश्य देता है। आपको असंतुलित जानकारी (जैसे कि हटाए गए विन्डोज़ पर रिपोर्ट करना) हो रही है या गेटटोपवंडो / गेटनडेड विन्डो का उपयोग करते हुए असीम छोरों का जोखिम उठता है, जब विंडोज़ पुनरावृत्ति के दौरान ज़ेड-ऑर्डर बदलती है।

EnumWindows एक कॉलबैक का उपयोग करता है कॉलबैक के प्रत्येक कॉल पर आपको विंडो संचालन मिलता है। खिड़की के स्क्रीन समन्वय प्राप्त करने से गुजरने के द्वारा GetWindowRect को प्राप्त किया जा सकता है। आपका कॉलबैक z- क्रम में विंडो स्थिति की सूची बनाता है

आप मतदान का उपयोग कर सकते हैं और बार-बार विंडो सूची तैयार कर सकते हैं। या, आप विंडो परिवर्तनों की सूचनाएं प्राप्त करने के लिए एक सीबीथुक सेट अप करते हैं सभी सीबीटी अधिसूचनाओं के परिणामस्वरूप शीर्ष स्तर की खिड़कियों के आदेश, स्थिति या दृश्यता में बदलाव आएगा, इसलिए एनएमडब्ल्यूडब्ल्यूडब्ल्यूओ को जेल-ऑर्डर में विंडो पोजीशन की एक नई सूची बनाने और फिर सूची को आगे बढ़ाने से पहले इसकी पिछली सूची की तुलना करने के लिए इसे फिर से करना बुद्धिमान है, ताकि एक वास्तविक परिवर्तन होने पर ही आगे की प्रक्रिया किया जा सके।

नोट करें कि हुकिंग के साथ, आप 32- और 64-बिट को मिलाकर नहीं कर सकते। यदि आप 32-बिट ऐप चला रहे हैं, तो आपको 32-बिट प्रक्रियाओं से नोटिफिकेशन मिलेगा। इसी प्रकार 64-बिट के लिए इस प्रकार, यदि आप 64-बिट मशीन पर पूरे सिस्टम की निगरानी करना चाहते हैं, तो ऐसा प्रतीत होता है कि दो ऐप्स चलाने के लिए आवश्यक है। मेरा तर्क यह पढ़ने से आता है:

SetWindowsHookEx का उपयोग किसी अन्य प्रक्रिया में एक DLL इंजेक्ट करने के लिए किया जा सकता है। 32-बिट डीएलएल को 64-बिट प्रक्रिया में इंजेक्ट नहीं किया जा सकता है, और 64-बिट डीएलएल को 32-बिट प्रक्रिया में इंजेक्ट नहीं किया जा सकता है। अगर किसी एप्लिकेशन को अन्य प्रक्रियाओं में हुकों के उपयोग की आवश्यकता होती है, तो 32-बिट अनुप्रयोग 32-बिट डीएलएल में 32-बिट प्रक्रियाओं को इंजेक्षन करने के लिए 32-बिट अनुप्रयोग कॉल सेट अप करना आवश्यक है, और एक 64-बिट अनुप्रयोग कॉल SetWindowsHookEx को 64-बिट इंजेक्ट करने के लिए 64-बिट प्रक्रियाओं में DLL 32-बिट और 64-बिट डीएलएल के पास अलग-अलग नाम होने चाहिए। (सेटविंडो हुकएक्स एपीआई पेज से।)

जैसा कि आप इसे जावा में कार्यान्वित कर रहे हैं, आप जेएनए को देखना चाह सकते हैं – यह देशी लाइब्रेरीज़ तक पहुंच बनाने के लिए बहुत आसान है (जावा में कॉलिंग कोड) और अपने खुद के देशी जेएनआई डीएलएल की आवश्यकता को हटा देता है

संपादित करें: आपने पूछा कि यह कितना कोड है और कितनी देर तक लिखना है। यहां जावा में कोड है

 import com.sun.jna.Native; import com.sun.jna.Structure; import com.sun.jna.win32.StdCallLibrary; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class Main { public static void main(String[] args) { Main m = new Main(); final List<WindowInfo> inflList = new ArrayList<WindowInfo>(); final List<Integer> order = new ArrayList<Integer>(); int top = User32.instance.GetTopWindow(0); while (top!=0) { order.add(top); top = User32.instance.GetWindow(top, User32.GW_HWNDNEXT); } User32.instance.EnumWindows(new WndEnumProc() { public boolean callback(int hWnd, int lParam) { if (User32.instance.IsWindowVisible(hWnd)) { RECT r = new RECT(); User32.instance.GetWindowRect(hWnd, r); if (r.left>-32000) { // minimized byte[] buffer = new byte[1024]; User32.instance.GetWindowTextA(hWnd, buffer, buffer.length); String title = Native.toString(buffer); inflList.add(new WindowInfo(hWnd, r, title)); } } return true; } }, 0); Collections.sort(inflList, new Comparator<WindowInfo>() { public int compare(WindowInfo o1, WindowInfo o2) { return order.indexOf(o1.hwnd)-order.indexOf(o2.hwnd); } }); for (WindowInfo w : inflList) { System.out.println(w); } } public static interface WndEnumProc extends StdCallLibrary.StdCallCallback { boolean callback (int hWnd, int lParam); } public static interface User32 extends StdCallLibrary { final User32 instance = (User32) Native.loadLibrary ("user32", User32.class); boolean EnumWindows (WndEnumProc wndenumproc, int lParam); boolean IsWindowVisible(int hWnd); int GetWindowRect(int hWnd, RECT r); void GetWindowTextA(int hWnd, byte[] buffer, int buflen); int GetTopWindow(int hWnd); int GetWindow(int hWnd, int flag); final int GW_HWNDNEXT = 2; } public static class RECT extends Structure { public int left,top,right,bottom; } public static class WindowInfo { int hwnd; RECT rect; String title; public WindowInfo(int hwnd, RECT rect, String title) { this.hwnd = hwnd; this.rect = rect; this.title = title; } public String toString() { return String.format("(%d,%d)-(%d,%d) : \"%s\"", rect.left,rect.top,rect.right,rect.bottom,title); } } } 

मैंने सबसे अधिक संबंधित वर्गों और इंटरफेस को आंतरिक श्रेणी बनाए रखा है ताकि उदाहरण के लिए कॉम्पैक्ट और तत्काल संकलन के लिए पेस्ट करने योग्य हो। एक वास्तविक कार्यान्वयन में, वे नियमित रूप से शीर्ष-स्तरीय वर्ग होंगे कमांड लाइन ऐप दृश्य विंडो और उनके स्थान को प्रिंट करता है। मैं इसे 32-बिट दोनों jvm और 64-bit पर चला गया, और प्रत्येक के लिए एक ही परिणाम मिला

EDIT2: z- आदेश शामिल करने के लिए अद्यतन कोड यह GetNextWindow का उपयोग करता है उत्पादन अनुप्रयोग में, आपको शायद अगले और पिछले मानों के लिए दो बार GetNextWindow को कॉल करना चाहिए और जांच लें कि वे संगत हैं और वैध विंडो हैंडल हैं।

क्या यह किया जा सकता है?

हां, हालांकि आपको कॉलबैक के संबंध में आप क्या चाहते हैं, यह जानने के लिए आपको हुक रजिस्टर करना होगा। आपको संभवत: एक सीबीटीक्रैक कॉलबैक हुक का उपयोग करना होगा, जिसे जब भी कहा जाता है:

सक्रिय करना, निर्माण करना, नष्ट करना, कम से कम करना, अधिकतम करना, चलाना, या एक विंडो को आकार देना; सिस्टम कमांड पूरा करने से पहले; सिस्टम संदेश कतार से एक माउस या कुंजीपटल घटना को हटाने से पहले; कुंजीपटल फ़ोकस सेट करने से पहले; या सिस्टम संदेश कतार से तुल्यकालन करने से पहले

ध्यान दें हालांकि मुझे विश्वास नहीं है कि ऐसे हुक कंसोल विंडो पर काम करते हैं क्योंकि वे कर्नेल के डोमेन हैं, न कि Win32।

वहाँ अच्छी तरह से दस्तावेज विंडोज एपीआई (और उनके ऐनक के अनुसार काम) कर रहे हैं कि ऐसा करने की अनुमति?

हाँ। आप सही विंडो में डेस्कटॉप पर सभी खिड़की के हैंडल प्राप्त करने के लिए GetTopWindow और GetNextWindow फ़ंक्शन का उपयोग कर सकते हैं।

क्या हर बार किसी विंडो में कॉलबैक दर्ज करना आसान है? (यदि इसे पुनः आकार दिया गया है, स्थानांतरित किया गया है, वापस / सामने लाया गया है या एक नई विंडो पॉप-अप आदि)

पहला जवाब देखें 🙂

क्या हो सकता है?

पहला जवाब देखें 🙂

बोनस प्रश्न: कल्पना करें कि आपको एक छोटी सी फाइल लिखने की ज़रूरत होगी। एक्सचेंज ने खिड़कियों के नाम / स्थिति / आकार को एक अस्थायी फ़ाइल में लिखना हर बार स्क्रीन पर एक विंडो में परिवर्तन किया है, इस तरह का कार्यक्रम आपकी पसंद की भाषा में कितना समय तक होगा और कितनी देर तक क्या आपको इसे लिखना होगा?

सी की कुछ सौ लाइनें, और एक दो घंटे हालांकि मुझे किसी तरह के मतदान का उपयोग करना होगा – मैंने अपने से पहले हुक कभी नहीं किया है अगर मुझे हुकों की ज़रूरत होती तो यह कुछ हद तक अधिक समय लगेगा

मुझे 2006 में याद है कि एक प्रणाली के रूप में WinObj उपयोग की गई थी, जो संभवत: आपके लिए क्या चाहते थे। इन उपयोगिताओं का एक हिस्सा लेखक (मार्क रसेनोविच) द्वारा स्रोत कोड के साथ प्रदान किया गया था।

उस समय से, उनकी कंपनी को माइक्रोसॉफ्ट द्वारा खरीदा गया था, इसलिए मुझे नहीं पता कि स्रोत अभी भी उपलब्ध होगा या नहीं।

इसके अलावा निम्नलिखित जाँच के लायक हो सकता है:

http://msdn.microsoft.com/en-us/library/aa264396(VS.60).aspx

http://www.codeproject.com/KB/dialog/windowfinder.aspx