2009-06-16 12 views
7

मैं कैसे जांच सकता हूं कि कोई अन्य एप्लिकेशन कम हो गया है या नहीं? उदाहरण के लिए इस तरह एक लूप में:कैसे जांचें कि कोई अन्य ऐप कम हो गया है या नहीं?

foreach(Process p in processes) 
{ 
    // Does a process have a window? 
    // If so, is it minimized, normal, or maximized 
} 

उत्तर

11
[DllImport("user32.dll")] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl); 

    private struct WINDOWPLACEMENT { 
     public int length; 
     public int flags; 
     public int showCmd; 
     public System.Drawing.Point ptMinPosition; 
     public System.Drawing.Point ptMaxPosition; 
     public System.Drawing.Rectangle rcNormalPosition; 
    } 

if (p.MainWindowHandle != IntPtr.Zero) { 
    if (p.MainWindowTitle.Contains("Notepad")) { 
     WINDOWPLACEMENT placement = new WINDOWPLACEMENT(); 
     GetWindowPlacement(p.MainWindowHandle, ref placement); 
     switch (placement.showCmd) { 
      case 1: 
      Console.WriteLine("Normal"); 
      break; 
      case 2: 
      Console.WriteLine("Minimized"); 
      break; 
      case 3: 
      Console.WriteLine("Maximized"); 
      break; 
     } 
    }     
} 
+1

सावधान रहें यदि आप rcNormalPosition प्रॉपर्टी का उपयोग करने की योजना बना रहे हैं - दाएं के लिए मान, और नीचे की बजाय चौड़ाई और ऊंचाई में संग्रहीत किया जा रहा है, जिससे आपकी खिड़कियां भ्रामक रूप से बड़ी लगती हैं। – BrainSlugs83

5

कम से कम "एप्लिकेशन" जैसी कोई चीज़ नहीं है। सबसे अच्छा विकल्प यह जांचना होगा कि एप्लिकेशन की मुख्य विंडो आइकॉनिक (न्यूनतम) है या नहीं।

IsIconic का उपयोग विंडो की प्रतिष्ठित स्थिति की जांच के लिए किया जा सकता है। यदि खिड़की कम हो जाती है तो यह 1 वापस आ जाएगी। आप इसे process.MainWindowHandle के साथ कॉल कर सकते हैं।

+2

यह पता लगाने के लिए कि कोई विंडो अधिकतम है या नहीं, आप IsZoomed को कॉल कर सकते हैं। – aquinas

+0

हाँ - अच्छा जोड़ा। –

1

प्रक्रियाओं की गणना करने के बजाय, आपको मूल EnumWindows() function का उपयोग करना चाहिए और फिर IsIconic को कॉल करना चाहिए।

+0

क्यों? बीटीडब्ल्यू, एनमविंडोज़ मेरा मूल संस्करण था, लेकिन मैंने इसे प्रबंधित कोड में बदल दिया। – AngryHacker

+0

@AngryHacker: आप अभी भी Pum/EnumWindows में शामिल हो सकते हैं। यह प्रक्रिया का उपयोग करने की कोशिश करने की तुलना में संभावित रूप से बेहतर है, जब तक कि आप केवल मुख्य विंडो में रूचि न लें। आपको अभी भी IsIconic (या GetWindowPlacement) के लिए पी/Invoke की आवश्यकता है। –

+0

मैं अभी भी अस्पष्ट हूं कि EnumWindows को क्यों पसंद किया जाता है? – AngryHacker

3

एक खिड़की कम से कम है, तो (विंडोज़ रूपों में कम से कम) दोनों Location.X और Location.Y मान हैं -32000

+0

+1: यह पूरी तरह से "साफ" समाधान नहीं हो सकता है लेकिन यह निश्चित रूप से चाल करता है। लेकिन आपको अवगत होना चाहिए कि खिड़की की स्थिति नकारात्मक हो सकती है भले ही उन्हें कम नहीं किया गया हो। जब एक खिड़की मॉनीटर को लापता कर रही है। – McK

0

आप अधिकतम और isIconic के लिए isZoomed उपयोग कर सकते हैं user32 dll

इंजेक्शन लगाने के द्वारा कम से कम के लिए
[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool IsIconic(IntPtr hWnd); 
[DllImport("user32.dll")] 
static extern bool IsZoomed(IntPtr hWnd); 
संबंधित मुद्दे