C# 在Windows 7中隐藏桌面项目-不工作
在前面的问题中,有一个关于如何隐藏桌面项目的说明: 出于某种原因,这个代码对我不起作用 我会简单地评论上面的链接,但我没有足够的特权评论其他人的问题 你知道怎么回事吗?桌面根本不隐藏 更新:此外,我尝试使用以下代码(如建议的),但仍然没有效果:C# 在Windows 7中隐藏桌面项目-不工作,c#,dll,windows-7,desktop,dllimport,C#,Dll,Windows 7,Desktop,Dllimport,在前面的问题中,有一个关于如何隐藏桌面项目的说明: 出于某种原因,这个代码对我不起作用 我会简单地评论上面的链接,但我没有足够的特权评论其他人的问题 你知道怎么回事吗?桌面根本不隐藏 更新:此外,我尝试使用以下代码(如建议的),但仍然没有效果: struct SHELLSTATE { bool fShowAllObjects; bool fShowExtensions; bool fNoConfirmRecycle; bool fShowSysF
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", "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代码以及有关窗口样式的更多信息:这是一个严重的问题。我并不奇怪它不起作用。您是否寻找使用IShellFolder的基于shell api的方法?另一个值得检查的api是使用bit,在中提到过。我自己也没试过,不过可能值得一试。(警告-其他两个答案也有粗俗的黑客。)另一个答案不是真正的答案。这是一种基于未记录的实现细节的黑客攻击。shell有一个非常丰富的COM接口。获取桌面的IShellFolder并对其进行操作。@Jacob,您可能希望提供更多关于您在此处尝试执行的操作的背景信息。你是想直接替换外壳,比如在一个专用的信息亭上,还是仅仅替换桌面背景,或者运行全屏,或者其他什么?这是一个永久性的替代,还是仅仅在某个应用程序运行期间?@Jacob-应该是使用P/Invoke的一个相当简单的例子;看这个。但是请记住,有很多方法可以绕过这种类型的应用程序;右键单击桌面仍会显示菜单,Ctrl-ESC将显示windows菜单,Alt-Tab将切换到其他应用程序,Ctrl-Alt-del可用于显示锁定的桌面,并从此处显示任务管理器。如果“kiosk lite”还可以,那么成为最顶级的全屏应用程序(就像许多游戏或媒体播放器等)可能是一种更简单/更干净的方法。。。