2011-06-19 17 views

Odpowiedz

18

Możesz to zrobić za pomocą interfejsu API systemu Windows. Oto przykładowy kod w języku C#, który będzie przełączał ikony pulpitu.

[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); 
    } 

ten wysyła komunikat do okna potomnego SHELLDLL_DefView z Progman, który mówi to, aby przełączać widoczność (przez dodanie lub usunięcie WS_VISIBLE styl) od niej tylko dziecko „folderview”. "FolderView" to rzeczywiste okno zawierające ikony.

Aby przetestować, aby sprawdzić, czy ikony są widoczne lub nie, można zapytać o WS_VISIBLE stylu przy użyciu funkcji GetWindowInfo, przedstawiono poniżej:

[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))); 
     } 

    } 

Oto funkcja, która zwraca powyższy kod i zwraca true jeśli okno jest widoczne, false, jeśli nie.

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; 
    } 

kodu Windows API wraz z dodatkowymi informacjami na temat stylów okien można znaleźć tutaj: http://www.pinvoke.net/default.aspx/user32/GetWindowInfo.html

+2

Awesome, zamierzam umieścić to we wszystkich moich aplikacjach od teraz i przełącz() to losowo. :) – Gleno

+0

To nie działa na moim komputerze ... Używam Windows 7. Czy ten system operacyjny jest zależny? Czy powinien działać we wszystkich wersjach systemu Windows? Jeśli tak, będę szukał innego rozwiązania, które działa na wielu wersjach systemu Windows ... – Tibi

+0

Aktualizacja: Działa, najwyraźniej musiałem ponownie uruchomić explorer.exe, ale teraz działa. Dziękuję Ci bardzo. Kolejne pytanie ... skąd mogę wiedzieć, czy jest włączony czy wyłączony? – Tibi

1

Możesz utworzyć aplikację widoku pełnoekranowego i ustawić ją w najwyższym oknie.

Następnie należy uruchomić aplikację z oknami.

+2

Jeśli zrobię to top najbardziej, to będzie na wierzchu wszystkich innych aplikacji ... to musi być dokładnie odwrotnie, dno najbardziej okno, z wyjątkiem paska zadań. – Tibi

0

Idziesz na ten temat niewłaściwy sposób. Naprawdę próbujesz zastąpić powłokę. System Windows zapewnia to, więc powinieneś po prostu z niego skorzystać. Napisz własną powłokę, aby zastąpić eksploratora.

+1

Nie próbuję zastąpić powłoki, tylko pulpit. Zamiast nudnych ikon, będę miał fajne widżety. – Tibi

0

Można to zrobić w RegEdit HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Zaawansowanych HideIcons zmian do 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(); 
     } 
    } 

użyć klasy rejestru, jak opisano tutaj.

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