2010-08-13 17 views
6

यदि मैं Application.Current.Windows में विंडोज़ का आकलन कर रहा हूं, तो मैं कैसे कह सकता हूं, किसी भी दो विंडो के लिए, कौन सा "करीब" है (यानी ज़ेड-इंडेक्स अधिक है)?जेड-इंडेक्स द्वारा विंडोज को कैसे सॉर्ट करें?

या, दूसरे शब्दों में यह कहने के लिए, मैं उन विंडो को जेड-इंडेक्स द्वारा कैसे क्रमबद्ध कर सकता हूं?

उत्तर

6

आपको WPF से विंडो की जेड ऑर्डर जानकारी नहीं मिल सकती है, इसलिए आपको Win32 का सहारा लेना होगा।

var topToBottom = SortWindowsTopToBottom(Application.Current.Windows.OfType<Window>()); 
... 

public IEnumerable<Window> SortWindowsTopToBottom(IEnumerable<Window> unsorted) 
{ 
    var byHandle = unsorted.ToDictionary(win => 
    ((HwndSource)PresentationSource.FromVisual(win)).Handle); 

    for(IntPtr hWnd = GetTopWindow(IntPtr.Zero); hWnd!=IntPtr.Zero; hWnd = GetNextWindow(hWnd, GW_HWNDNEXT) 
    if(byHandle.ContainsKey(hWnd)) 
     yield return byHandle[hWnd]; 
} 

const uint GW_HWNDNEXT = 2; 
[DllImport("User32")] extern IntPtr GetTopWindow(IntPtr hWnd); 
[DllImport("User32")] extern IntPtr GetNextWindow(IntPtr hWnd, uint wCmd); 

तरीका यह काम करता है::

कुछ इस तरह चाल करना चाहिए

  1. यह खिड़की संभाल द्वारा दिए गए खिड़कियों सूचकांक करने के लिए एक शब्दकोश का उपयोग करता है, इस तथ्य का उपयोग करने में कि डब्ल्यूपीएफ के विंडोज कार्यान्वयन, विंडो का प्रस्तुति स्रोत हमेशा HwndSource है।
  2. यह उचित आदेश खोजने के लिए सभी अनपेक्षित विंडो शीर्ष से नीचे स्कैन करने के लिए Win32 का उपयोग करता है।
+0

और हां, क्षमा करें, इसके लिए अप्रबंधित कोड अनुमति ("पूर्ण विश्वास") की आवश्यकता है। –

+0

मैं इसे फिर भी स्वीकार करूंगा, क्योंकि अब तक यह एकमात्र उत्तर है। –

+0

क्या आप कृपया मेरे नवीनतम प्रश्न को देख सकते हैं? मुझे वास्तव में समस्या पर अपना कोण देखना पसंद है। http://stackoverflow.com/questions/3642763/static-verification-of- बाइंडिंग –

0

आह यह एक बहुत मज़ा एक था:

[DllImport("user32.dll")] 
static extern IntPtr GetActiveWindow(); 

public static Window ActiveWindow 
{ 
    get 
    { 
     return HwndSource.FromHwnd(GetActiveWindow()).RootVisual as Window; 
    } 
} 

यह आप अपने एप्लिकेशन में सक्रिय विंडो (जो आमतौर पर सबसे महत्वपूर्ण है) दे देंगे।

+0

मुझे लगता है कि इसका मतलब यह नहीं है कि उसका मतलब –

+2

न केवल मेरा मतलब है, बल्कि इसे पूर्ण ट्रस्ट की आवश्यकता है (जैसा कि कोई पी/आमंत्रण करता है)। और यह भी इसके लायक हो सकता है, क्या यह 'Window.IsActive' संपत्ति के साथ आसानी से प्राप्त नहीं किया जा सकता था। –

संबंधित मुद्दे