2011-06-19 15 views

Trả lời

18

Bạn có thể thực hiện việc này bằng API Windows. Đây là mã mẫu trong C# sẽ chuyển đổi các biểu tượng trên màn hình.

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

này sẽ gửi một thông điệp tới các cửa sổ con SHELLDLL_DefView của Progman, mà nói với nó để chuyển tầm nhìn (bằng cách thêm hoặc loại bỏ các phong cách WS_VISIBLE) của nó là đứa con duy nhất, "FolderView". "FolderView" là cửa sổ thực tế chứa các biểu tượng.

Để kiểm tra để xem nếu các biểu tượng có thể nhìn thấy hay không, bạn có thể truy vấn cho phong cách WS_VISIBLE bằng cách sử dụng chức năng GetWindowInfo, hiển thị dưới đây:

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

    } 

Đây là một chức năng mà các cuộc gọi đoạn code trên và trả về true nếu cửa sổ hiển thị, sai nếu không.

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

Mã windows API cùng với thêm thông tin về phong cách cửa sổ có thể được tìm thấy ở đây: http://www.pinvoke.net/default.aspx/user32/GetWindowInfo.html

+2

Tuyệt vời, tôi sẽ đặt nó vào tất cả các ứng dụng của tôi từ bây giờ và bật() ngẫu nhiên. :) – Gleno

+0

Dường như nó không hoạt động trên máy tính của tôi ... Tôi đang sử dụng windows 7. Hệ điều hành này có phụ thuộc không? Nó có hoạt động trên tất cả các phiên bản của windows không? Nếu có, tôi sẽ tìm kiếm một giải pháp khác hoạt động trên nhiều phiên bản của cửa sổ ... – Tibi

+0

Cập nhật: Nó hoạt động, dường như tôi phải khởi động lại explorer.exe, nhưng bây giờ nó hoạt động. Cảm ơn nhiều. Một câu hỏi khác ... làm thế nào tôi có thể biết nếu nó được bật hay tắt? – Tibi

1

Bạn có thể tạo ứng dụng xem toàn màn hình và đặt nó ở vị trí cao nhất trên cùng.

Sau đó, làm cho ứng dụng của bạn bắt đầu với cửa sổ.

+2

Nếu tôi làm cho nó đỉnh nhất, nó sẽ được trên đầu trang của tất cả các ứng dụng khác ... nó cần phải được hoàn toàn ngược lại, hầu hết các cửa sổ phía dưới, ngoại trừ các thanh tác vụ. – Tibi

0

Bạn đang đi về việc này một cách sai lầm. Những gì bạn đang thực sự cố gắng làm là thay thế vỏ. Windows cung cấp cho điều này vì vậy bạn chỉ nên tận dụng lợi thế của nó. Viết vỏ của riêng bạn để thay thế trình khám phá.

+1

Tôi không cố gắng thay vỏ, chỉ là màn hình nền. Thay vì có biểu tượng nhàm chán, tôi sẽ có một số vật dụng đẹp. – Tibi

0

Bạn có thể làm điều này trong RegEdit HKEY_CURRENT_USER \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Explorer \ nâng cao HideIcons thay đổi 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(); 
     } 
    } 

Sử dụng lớp Registry như đã mô tả ở đây.

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

Các vấn đề liên quan