2012-02-13 14 views
11

मैं फ़ोल्डरों के खोले गए सूची की सूची कैसे प्राप्त कर सकता हूं, इसके माध्यम से गणना कर सकता हूं और प्रत्येक फ़ोल्डर को प्रोग्रामेटिक रूप से कम कर सकता हूं?खुले विंडो फ़ोल्डरों को प्रोग्रामेटिक रूप से कम करने के लिए कैसे करें

कभी-कभी कुछ खुले फ़ोल्डर्स एप्लिकेशन में एक फॉर्म से दूसरे रूप में कूदते समय टूल से फोकस चुराते हैं। इसे रोकने से हमारे ग्राहक के लिए उच्च प्राथमिकता है। ग्राहक दृष्टिहीन लोगों को प्रभावित करते हैं, इसलिए वे केवल स्क्रीन पाठकों के माध्यम से मशीन तक पहुंचते हैं। अन्य खिड़कियों (फ़ोल्डर्स) को कम करना वास्तव में एक आवश्यकता नहीं है, वास्तव में एक आवश्यकता है।

foreach (Process p in Process.GetProcessesByName("explorer")) 
{ 
    p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; 
} 

के रूप में की उम्मीद यह अच्छा नहीं किया:

मैं इस कोशिश की।

अद्यतन:

delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam); 

    [DllImport("user32.dll")] 
    static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam); 

    static IEnumerable<IntPtr> EnumerateProcessWindowHandles(int processID) 
    { 
     List<IntPtr> handles = new List<IntPtr>(); 

     EnumThreadDelegate addWindowHandle = delegate(IntPtr hWnd, IntPtr param) 
     { 
      handles.Add(hWnd); 
      return true; 
     }; 

     foreach (ProcessThread thread in Process.GetProcessById(processID).Threads)        
      EnumThreadWindows(thread.Id, addWindowHandle, IntPtr.Zero); 

     return handles; 
    } 

    const int SW_MINIMIZED = 6; 

    [DllImport("user32.dll")] 
    static extern int ShowWindow(IntPtr hWnd, int nCmdShow); 

    private void button1_Click(object sender, EventArgs e) 
    { 
     foreach (IntPtr handle in EnumerateProcessWindowHandles(Process.GetProcessesByName("explorer")[0].Id)) 
      ShowWindow(handle, SW_MINIMIZED); 
    } 

यह अदृश्य एक्सप्लोरर खिड़कियों की एक पूरी बहुत बनाता है अचानक नहीं जहां से बाहर taksbar में सूचीबद्ध होने के लिए:

जवाब यहाँ से, मैं इस कोशिश की। मैं विंडोज एपीआई से निपटने में थोड़ा नोब हूं, इसलिए कोड स्वयं वास्तव में मदद करेगा।

+0

आप विंडो के लिए एक संदेश भेजने की जरूरत है, इस के लिए है विंडोज एपीआई स्तर पर किया जाना चाहिए। – Arjang

+0

@ अरजांग क्या मैं कहीं कुछ कोड देख सकता हूं? – nawfal

+1

अगर मेरे पास कोड था तो यह एक उत्तर नहीं था एक टिप्पणी नहीं। बस बेहतर Google खोज में सहायता करना चाहते थे। – Arjang

उत्तर

3

वहाँ स्वीकार किए जाते हैं यहाँ उपलब्ध जवाब तुलना में एक कम 'hacky' समाधान है: Minimize a folder

यह Shell Objects for Scripting पर आधारित है।नमूना:

const int SW_SHOWMINNOACTIVE = 7; 

[DllImport("user32.dll")] 
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

static void MinimizeWindow(IntPtr handle) 
{ 
    ShowWindow(handle, SW_SHOWMINNOACTIVE); 
} 

//call it like: 

foreach (IWebBrowser2 window in new Shell().Windows()) 
{ 
    if (window.Name == "Windows Explorer") 
     MinimizeWindow((IntPtr)window.HWND); 
} 

एक ही बात Internet Explorer Object Model

// add a reference to "Microsoft Internet Controls" COM component 
// also add a 'using SHDocVw;' 
foreach (IWebBrowser2 window in new ShellWindows()) 
{ 
    if (window.Name == "Windows Explorer") 
     MinimizeWindow((IntPtr)window.HWND); 
} 
+0

साइमन, इसके लिए धन्यवाद, यह काम करता है। इसके अलावा 'नया शैल()। विंडोज़' के बजाय आप 'इंटरप। एसएचडीओसीवी' में 'नया शैलविंडोज़() 'कॉल कर सकते हैं। स्वीकृत उत्तर का एक फायदा यह है कि यह अन्य अनुप्रयोगों की खिड़कियों के लिए भी आसान है, लेकिन यह दिए गए कार्य के लिए आसान है। मैं दो दिमाग में हूं कि किस जवाब को स्वीकार करने के लिए :) – nawfal

+0

क्या मैं प्रदर्शित करने के लिए आपके उत्तर में एक छोटा कोड स्निपेट जोड़ सकता हूं? इसके अलावा इसमें एक * छोटी * समस्या है जहां यह ऐप से फोकस लेती है। ऐसा नहीं है कि वापस लाने में मुश्किल है, लेकिन फिर भी यह एक छोटी सी गड़बड़ी है। क्या यह आपके साथ होता है? और पता है कि ऐसा क्यों होगा? – nawfal

+0

@nawfal - यदि आप चाहें तो एक स्निपेट जोड़ सकते हैं। यह सच है कि यह केवल विंडोज एक्सप्लोरर फ़ोल्डर विंडोज से संबंधित है - यह सवाल था :-) और मुझे लगता है कि यह भविष्य में सबूत है। यदि आप कम करना नहीं चाहते हैं, तो बस एक और ShowWindow कमांड का उपयोग करें, शायद SW_SHOWMINNOACTIVE। –

3

यदि आप पी-इनवॉक का उपयोग करने के इच्छुक हैं तो आप प्रक्रिया के सभी विंडोज़ को गिनाने के लिए EnumThreadWindows का उपयोग कर सकते हैं। फिर उन्हें कम करने के लिए ShowWindow का उपयोग करें।

+0

धन्यवाद। मुझे कोशिश करें कि – nawfal

+0

क्या यह सभी सामान्य विंडोज़ के माध्यम से गणना करने के लिए है? या सिर्फ फ़ोल्डर खिड़कियां? – nawfal

+0

आप इस विधि का उपयोग कर एक विशिष्ट प्रक्रिया की सभी शीर्ष खिड़कियों की गणना कर सकते हैं। आपके मामले में एक्सप्लोरर से संबंधित सभी खिड़कियां। आपको प्रक्रिया के मुख्य धागे को एक हैंडल प्राप्त करने की आवश्यकता है। – rasmus

5

// COM लाइब्रेरी "माइक्रोसॉफ्ट शैल नियंत्रण और स्वचालन" संदर्भित -shell32.dll द्वारा शैल कक्षा के कहने बनाएं

Shell32.ShellClass objShell = new Shell32.ShellClass(); 
//Show Desktop 
((Shell32.IShellDispatch4)objShell).ToggleDesktop(); 

संपादित करें: टॉगल के बाद आपके आवेदन (सक्रिय या अधिकतम/पुनर्स्थापित) को दिखाने के लिए वास्तव में निकला काफी मुश्किल हो रहे हैं:

मैंने कोशिश की:

Application.DoEvents(); 

System.Threading.Thread.Sleep(5000); 

यहां तक ​​कि अधिभावी WndProc घटना पर कब्जा करने के प्रबंधन नहीं किया:

private const Int32 WM_SYSCOMMAND = 0x112; 
     private const Int32 SC_MINIMIZE = 0xf020; 
     protected override void WndProc(ref Message m) 
     { 
      if (m.Msg == WM_SYSCOMMAND) 
      { 
       if (m.WParam.ToInt32() == SC_MINIMIZE) 
        return; 
      } 
      base.WndProc(ref m); 
     } 

तो मैं बजाय अन्य सभी विंडो को न्यूनतम का सुझाव देते हैं, बस आपरेशन के दौरान शीर्ष पर तुम्हारा रहना है, तो एक बार अपने समाप्त हमेशा बंद कर देते हैं शीर्ष पर:

[DllImport("user32.dll")] 
    static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); 

static readonly IntPtr HWND_TOPMOST = new IntPtr(-1); 

const UInt32 SWP_NOSIZE = 0x0001; 
const UInt32 SWP_NOMOVE = 0x0002; 
const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE; 

public static void MakeTopMost (IntPtr hWnd) 
{ 
    SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS); 
} 
+0

यह मेरे ऐप सहित सबकुछ कम करता है। यह। सक्रिय इसे सामने नहीं लाता है – nawfal

+0

क्षमा करें यह होना चाहिए। WindowState = FormWindowState.Maximized; –

+0

कोई रास्ता नहीं। यह अभी भी मेरे रूप को नीचे रखता है :( – nawfal

8

इस प्रयास करें (कोड कुछ हद तक गंदा है, लेकिन इस प्रयोजन के लिए आप इसे माध्यम से जाने के लिए सक्षम होना चाहिए;))

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 
using System.Text; 
using System.Globalization; 

namespace WindowsFormsApplication20 
{ 
    static class Program 
    { 
     [STAThread] 
     static void Main() 
     { 
      foreach (IntPtr handle in EnumerateProcessWindowHandles(Process.GetProcessesByName("explorer")[0].Id)) 
      { 
       SendMessage(handle, WM_SYSCOMMAND, SC_MINIMIZE, 0); 
      } 
     } 

     [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
     static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); 

     static string GetDaClassName(IntPtr hWnd) 
     { 
      int nRet; 
      StringBuilder ClassName = new StringBuilder(100); 
      //Get the window class name 
      nRet = GetClassName(hWnd, ClassName, ClassName.Capacity); 
      if (nRet != 0) 
      { 
       return ClassName.ToString(); 
      } 
      else 
      { 
       return null; 
      } 
     } 

     delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam); 

     [DllImport("user32.dll")] 
     static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam); 

     static IEnumerable<IntPtr> EnumerateProcessWindowHandles(int processID) 
     { 
      List<IntPtr> handles = new List<IntPtr>(); 

      EnumThreadDelegate addWindowHandle = delegate(IntPtr hWnd, IntPtr param) 
      { 
       string className = GetDaClassName(hWnd); 

       switch (className) 
       { 
        case null: 
         break; 
        case "ExploreWClass": 
         handles.Add(hWnd); 
         break; 
        case "CabinetWClass": 
         handles.Add(hWnd); 
         break; 
        default: 
         break; 
       } 

       return true; 
      }; 

      foreach (ProcessThread thread in Process.GetProcessById(processID).Threads) 
       EnumThreadWindows(thread.Id, addWindowHandle, IntPtr.Zero); 

      return handles; 
     } 

     [DllImport("user32.dll", CharSet = CharSet.Auto)] 
     static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam); 

     const int WM_SYSCOMMAND = 274; 
     const int SC_MINIMIZE = 0xF020; 
    } 
} 

सादर,

01,235,

Żubrówka

+0

मुझे इसे आज़माएं! धन्यवाद :) – nawfal

+0

I विश्वास नहीं कर सकता, यह अभी काम किया! :) – nawfal

+0

इससे पहले कि मैं आपको बक्षीस देता हूं, मुझे आपसे पूछने दो, अन्य खुली खिड़कियों को कम करने के लिए क्या किया जाना चाहिए, सभी एमएस एक्सेल विंडोज़ (एक ही खोल एपीआई का उपयोग करके? – nawfal

0

मैं जानता हूँ कि यह एक पुरानी पोस्ट है, लेकिन यहाँ मामला लोगों में एक बहुत छोटे, सरल तरीका है अभी भी एक के लिए देख रहे हैं का उपयोग कर प्राप्त किया जा सकता समाधान:

Windows API का उपयोग करना:

घोषित एक विंडोज़ संभाल: (बुला निष्पादन को कम करता है)

HWND wHandle; //can be any scope - I use it in main 

कॉल कहीं भी निम्नलिखित (wHandle के दायरे के आधार पर):

wHandle = GetActiveWindow(); 
ShowWindow(wHandle, SW_SHOWMINNOACTIVE); 
संबंधित मुद्दे

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