在 Windows 7 中隐藏桌面项目 - 不起作用
Posted
技术标签:
【中文标题】在 Windows 7 中隐藏桌面项目 - 不起作用【英文标题】:Hiding desktop items in Windows 7 - not working 【发布时间】:2011-11-20 08:38:52 【问题描述】:在上一个问题中,有一个解释如何隐藏桌面项目:
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();
【问题讨论】:
这个答案是一个严重的黑客。我并不惊讶它不起作用。您是否在寻找使用 IShellFolder 的基于 shell api 的方法? 另一个值得一试的 API 是使用SHELLSTATE.fHideIcons 位的SHGetSetSettings,在this post 中提到过。自己没有尝试过,虽然可能值得一试。 (警告 - 其他两个答案也有严重的黑客攻击。) 另一个答案不是真正的答案。这是基于未记录的实现细节的黑客攻击。 shell有一个非常丰富的COM接口。获取桌面的 IShellFolder 并对其进行操作。 @Jacob,您可能想提供更多关于您在此处尝试执行的操作的背景信息。你是想彻底更换外壳,比如在专用信息亭上,还是只是更换桌面背景,或者全屏运行,或者其他什么?这是永久替代品,还是仅在某些正在运行的应用程序的持续时间内? @Jacob - 应该是一个相当简单的使用 P/Invoke 的案例;看到这个tutorial on MSDN。请记住,尽管有多种方法可以避开此类应用程序;右键单击桌面可能仍会调出菜单,Ctrl-ESC 将调出 windows 菜单,Alt-Tab 将切换到其他应用程序 - 并且 Ctrl-alt-del 可用于调出锁定的桌面并从那里调出任务管理器。如果“kiosk-lite”很好,那么成为最***的全屏应用程序(就像许多游戏或媒体播放器等一样)可能是一种更简单/更清洁的方法...... 【参考方案1】:这里是切换桌面图标的 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", "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;
可以在此处找到 Windows API 代码以及有关窗口样式的更多信息:http://www.pinvoke.net/default.aspx/user32/GetWindowInfo.html
【讨论】:
以上是关于在 Windows 7 中隐藏桌面项目 - 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
添加 VirtualHost 失败:访问禁止错误 403 (XAMPP) (Windows 7)
添加 VirtualHost 失败:访问禁止错误 403 (XAMPP) (Windows 7)
添加 VirtualHost 失败:访问禁止错误 403 (XAMPP) (Windows 7)