微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 隐藏Windows 7中的桌面项目 – 无法正常工作

在上一个问题中,有一个解释如何隐藏桌面项:

How to hide desktop icons programatically?

出于某种原因,此代码对我不起作用.

我会简单地评论上面的链接,但我没有足够的权限评论其他人的问题……

有什么想法会出错吗?桌面根本不隐藏.

更新:此外,我尝试使用以下代码(如建议here),但仍然没有效果

struct SHELLSTATE
{
      bool fShowAllObjects;
      bool fShowExtensions;
      bool fNoConfirmRecycle;
      bool fShowSysFiles;
      bool fShowCompColor;
      bool fDoubleClickInWebView;
      bool fDesktopHTML;
      bool fWin95Classic;
      bool fDontPrettyPath;
      bool fShowAttribCol;
      bool fMapNetDrvBtn;
      bool fShowInfoTip1;
      bool fHideIcons1;
      bool fWebView1;
      bool fFilter1;
      bool fShowSuperHidden1;
      bool fNoNetCrawling1;
      UInt32 dwWin95Unused;
      uint uWin95Unused;
      long lParamSort;
      int   iSortDirection;
      uint version;
      uint uNotUsed;
      bool fSepProcess;
      bool fStartPanelOn;
      bool fShowStartPage;
      bool fAutocheckSelect;
      bool fIconsOnly;
      bool fShowTypeOverlay;
      uint fSpareFlags;
}

class MyClass
{
    const UInt32 SSF_HIDEICONS = 0x00004000;

    [DllImport("Shell32.dll")]
    static extern void SHGetSetSettings(ref SHELLSTATE state,UInt32 dwMask,bool bSet);
    static void Foobar()
    {
        SHELLSTATE stateOfMind = new SHELLSTATE();
        Console.WriteLine("Set to true:");
        SHGetSetSettings(ref stateOfMind,SSF_HIDEICONS,true);
        Console.ReadKey();
        Console.WriteLine("Set to false:");
        SHGetSetSettings(ref stateOfMind,SSF_HIDEICONAS,false);
        Console.ReadKey();
    }
}

解决方法

以下是C#中将切换桌面图标的示例代码.

[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子窗口发送一条消息,告诉它切换它唯一的子项“FolderView”的可见性(通过添加删除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)));
    }

}

这是一个调用上面代码函数,如果窗口可见则返回true,否则返回false.

static bool IsVisible()
{
    IntPtr hWnd = Getwindow(Getwindow(FindWindow("Progman",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;
}

可以在此处找到Windows API代码以及有关窗口样式的更多信息:http://www.pinvoke.net/default.aspx/user32/GetWindowInfo.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐