2011-06-19 14 views
8

सी # का उपयोग करके मैं प्रोग्राम आइकन को प्रोग्रामेटिक रूप से कैसे दिखा/छुपा सकता हूं?प्रोग्राम आइकन के रूप में डेस्कटॉप आइकन कैसे छिपाएं?

मैं एक वैकल्पिक डेस्कटॉप बनाने की कोशिश कर रहा हूं, जो विजेट का उपयोग करता है, और मुझे पुराने आइकन छुपाने की आवश्यकता है।

उत्तर

18

आप विंडोज एपीआई का उपयोग कर ऐसा कर सकते हैं। यहां सी # में नमूना कोड है जो डेस्कटॉप आइकन टॉगल करेगा।

[DllImport("user32.dll", SetLastError = true)] static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 
    [DllImport("user32.dll", SetLastError = true)] static extern IntPtr GetWindow(IntPtr hWnd, GetWindow_Cmd uCmd); 
    enum GetWindow_Cmd : uint 
    { 
     GW_HWNDFIRST = 0, 
     GW_HWNDLAST = 1, 
     GW_HWNDNEXT = 2, 
     GW_HWNDPREV = 3, 
     GW_OWNER = 4, 
     GW_CHILD = 5, 
     GW_ENABLEDPOPUP = 6 
    } 
    [DllImport("user32.dll", CharSet = CharSet.Auto)] static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); 

    private const int WM_COMMAND = 0x111; 

    static void ToggleDesktopIcons() 
    { 
     var toggleDesktopCommand = new IntPtr(0x7402); 
     IntPtr hWnd = GetWindow(FindWindow("Progman", "Program Manager"), GetWindow_Cmd.GW_CHILD); 
     SendMessage(hWnd, WM_COMMAND, toggleDesktopCommand, IntPtr.Zero); 
    } 

यह Progman की SHELLDLL_DefView चाइल्ड विंडो है, जो बताता है कि यह दृश्यता टॉगल करने के लिए इसके बारे में (जोड़ने या WS_VISIBLE शैली को हटाने के द्वारा) को संदेश भेजता है इकलौती संतान, "folderview" है। "फ़ोल्डर दृश्य" वास्तविक विंडो है जिसमें आइकन हैं।

यदि आइकन दृश्यमान हैं या नहीं यह देखने के लिए परीक्षण करने के लिए, आप GetWindowInfo फ़ंक्शन का उपयोग करके WS_VISIBLE शैली के लिए क्वेरी कर सकते हैं पर गौर करें:

[return: MarshalAs(UnmanagedType.Bool)] 
    [DllImport("user32.dll", SetLastError = true)] 
    private static extern bool GetWindowInfo(IntPtr hwnd, ref WINDOWINFO pwi); 

    [StructLayout(LayoutKind.Sequential)] 
    public struct RECT 
    { 
     private int _Left; 
     private int _Top; 
     private int _Right; 
     private int _Bottom; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    struct WINDOWINFO 
    { 
     public uint cbSize; 
     public RECT rcWindow; 
     public RECT rcClient; 
     public uint dwStyle; 
     public uint dwExStyle; 
     public uint dwWindowStatus; 
     public uint cxWindowBorders; 
     public uint cyWindowBorders; 
     public ushort atomWindowType; 
     public ushort wCreatorVersion; 

     public WINDOWINFO(Boolean? filler) 
      : this() // Allows automatic initialization of "cbSize" with "new WINDOWINFO(null/true/false)". 
     { 
      cbSize = (UInt32)(Marshal.SizeOf(typeof(WINDOWINFO))); 
     } 

    } 

यहाँ एक समारोह है कि इसके बाद के संस्करण कोड कहता है और सच रिटर्न है अगर खिड़की दिखाई दे रही है, तो झूठ नहीं है।

static bool IsVisible() 
    { 
     IntPtr hWnd = GetWindow(GetWindow(FindWindow("Progman", "Program Manager"), GetWindow_Cmd.GW_CHILD), GetWindow_Cmd.GW_CHILD); 
     WINDOWINFO info = new WINDOWINFO(); 
     info.cbSize = (uint)Marshal.SizeOf(info); 
     GetWindowInfo(hWnd, ref info); 
     return (info.dwStyle & 0x10000000) == 0x10000000; 
    } 

खिड़की शैलियों के बारे में अधिक जानकारी के साथ खिड़कियों एपीआई कोड यहां पाया जा सकता: http://www.pinvoke.net/default.aspx/user32/GetWindowInfo.html

+2

बहुत बढ़िया, मैं अब से अपने सभी ऐप्स में इसे टॉगल करने के लिए जा रहा हूं() यह यादृच्छिक रूप से। :) – Gleno

+0

यह मेरे कंप्यूटर पर काम नहीं कर रहा है ... मैं विंडोज 7 का उपयोग कर रहा हूं। क्या यह ओएस निर्भर है? क्या यह विंडोज़ के सभी संस्करणों पर काम करना चाहिए? यदि ऐसा है, तो मैं एक और समाधान की तलाश करूँगा जो विंडोज़ के कई संस्करणों पर काम करता है ... – Tibi

+0

अद्यतन: यह काम करता है, जाहिर है, मुझे explorer.exe को पुनरारंभ करना पड़ा था, लेकिन अब यह काम करता है। आपका बहुत बहुत धन्यवाद। एक और सवाल ... मैं कैसे जान सकता हूं कि यह चालू है या नहीं? – Tibi

1

आप एक पूर्ण स्क्रीन दृश्य एप्लिकेशन बना सकते हैं और इसे सबसे अधिक विंडो बना सकते हैं।

फिर अपने एप्लिकेशन को विंडोज़ के साथ शुरू करने के लिए बनाएं।

+2

अगर मैं यह सबसे ऊपर, यह अन्य सभी अनुप्रयोगों के शीर्ष पर होगा बनाने ... यह बिल्कुल विपरीत, नीचे सबसे खिड़की, टास्कबार को छोड़कर की जरूरत है। – Tibi

0

आप इस गलत रास्ते के बारे में जा रहे हैं। आप वास्तव में क्या करना चाहते हैं वह खोल को प्रतिस्थापित करना है। विंडोज इसके लिए प्रदान करता है ताकि आपको इसका लाभ उठाना चाहिए। एक्सप्लोरर को बदलने के लिए अपना खुद का खोल लिखें।

+1

में काम नहीं करता है, मैं खोल को बदलने की कोशिश नहीं कर रहा हूं, बस डेस्कटॉप। उबाऊ आइकन होने के बजाय, मेरे पास कुछ अच्छे विजेट होंगे। – Tibi

1

एक अलग दृष्टिकोण एक अलग डेस्कटॉप बनाने और इसके बजाय इसे दिखाने के लिए एक अलग दृष्टिकोण है। इसमें आइकन नहीं होंगे।

Application running itself on a separate desktop

0

आप इस RegEdit HKEY_CURRENT_USER \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ एक्सप्लोरर \ उन्नत परिवर्तन HideIcons में 1

static void HideIcons() 
    { 
     RegistryKey myKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced", true); 
     if (myKey != null) 
     { 
      myKey.SetValue("HideIcons", 1); 
      myKey.Close(); 
     } 
    } 

उपयोग करने के लिए रजिस्ट्री वर्ग के रूप में यहाँ वर्णित कर सकते हैं।

http://msdn.microsoft.com/en-us/library/microsoft.win32.registry.aspx

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