我找到了一些显示/隐藏桌面图标的代码,但它会在此过程中移动图标。如何编辑代码以不移动图标?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我找到了一些显示/隐藏桌面图标的代码,但它会在此过程中移动图标。如何编辑代码以不移动图标?相关的知识,希望对你有一定的参考价值。
我正在为Rainmeter使用两个批处理文件,一个用于隐藏所有图标然后启动Rainmeter,另一个用于显示所有图标并退出Rainmeter以使我的桌面再次显示正常。
我的最终目标是将这两个批处理文件放入我的任务栏上的按钮,我可以单击以切换桌面的外观。
到目前为止,我只是两个批处理文件,但他们所做的只是显示和隐藏桌面图标。 (我在网上找到了代码因为我自己写不了)
show.bat
REG ADD "HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced" /V HideIcons /T REG_DWORD /D 0 /F
taskkill /f /im explorer.exe
start explorer.exe
hide.bat
REG ADD "HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced" /V HideIcons /T REG_DWORD /D 1 /F
taskkill /f /im explorer.exe
start explorer.exe
所以the code I found works fine but比手动隐藏桌面图标要简单得多......唯一的问题是,当我运行show.bat时,我的图标会回到我不想要它们的位置。
我怎么能一个,让批处理文件更顺利地显示/隐藏图标,两个,不移动图标?
PS:只是想强调我真的不知道我发现的代码是如何工作的,所以你可能需要ELI5。
首先,TLDR:我不认为批处理文件中你想要什么,所以我编写了一个小程序,每次运行时都会打开和关闭桌面图标,不会影响位置。 https://drive.google.com/open?id=0B3XhtKLdqFaMOUtrLTk2VEQyVWM
这要归功于堆栈溢出的另一个答案,但是根据你的说法,我认为你没有自己使用该答案的技能......所以我为你做了。
ELI5:
我相信你的图标移动的原因是因为你使用taskkill来结束explorer.exe。资源管理器是Windows中的程序,它运行您看到的大部分内容,例如开始栏和桌面,以及浏览驱动程序和文件夹时。
所以,
taskkill /f /im explorer.exe
停止explorer.exe死,这就是为什么当你运行批处理时,你看到你的起始栏会瞬间消失。在这样停止它时,它没有机会保存你的Icon位置,所以它们总是恢复到最后的已知位置。
您找到的脚本的原因是因为停止explorer.exe然后再次启动它会刷新您的桌面,这意味着第一行:
REG ADD "HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced" /V HideIcons /T REG_DWORD /D 1 /F
可以生效。此行更改窗口中的设置以显示“隐藏我的桌面图标”
解决方案(种类)我不知道在刷新桌面设置的简单批处理文件中的方法,但是,我确实在堆栈溢出中看到了这个答案,这是用c#How to refresh/reload Desktop编写的
我知道你可能没有使用这个答案的知识,所以我为你做了一个只需切换你的图标的exe
https://drive.google.com/open?id=0B3XhtKLdqFaMOUtrLTk2VEQyVWM
每次运行它时都会调用ToggleIcons.exe,它所做的就是打开或关闭桌面图标
要使用它,只需将其弹出与批处理文件相同的文件夹并添加以下行:
ToggleIcons.exe
到你的脚本。
你可以删除已有的3行,因为这基本上可以完成所有这3件事。但是,它不会重新启动explorer.exe,这意味着您的图标不会移动到任何地方
我也为你准备了源代码,因为从陌生人那里拿糖果往往并不理想,所以如果你觉得使用它不舒服,我不会被冒犯! :d
为了防止其他答案的链接丢失,以下是来源:
class Program
{
//Thanks to https://stackoverflow.com/questions/17503289/how-to-refresh-reload-desktop
[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);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
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
}
private const int WM_COMMAND = 0x111;
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
private delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern int GetWindowText(IntPtr hWnd, StringBuilder strText, int maxCount);
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern int GetWindowTextLength(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern bool EnumWindows(EnumWindowsProc enumProc, IntPtr lParam);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
[DllImport("user32.dll", SetLastError = false)]
static extern IntPtr GetShellWindow();
public static string GetWindowText(IntPtr hWnd)
{
int size = GetWindowTextLength(hWnd);
if (size++ > 0)
{
var builder = new StringBuilder(size);
GetWindowText(hWnd, builder, builder.Capacity);
return builder.ToString();
}
return String.Empty;
}
public static IEnumerable<IntPtr> FindWindowsWithClass(string className)
{
IntPtr found = IntPtr.Zero;
List<IntPtr> windows = new List<IntPtr>();
EnumWindows(delegate (IntPtr wnd, IntPtr param)
{
StringBuilder cl = new StringBuilder(256);
GetClassName(wnd, cl, cl.Capacity);
if (cl.ToString() == className && (GetWindowText(wnd) == "" || GetWindowText(wnd) == null))
{
windows.Add(wnd);
}
return true;
},
IntPtr.Zero);
return windows;
}
static void ToggleDesktopIcons()
{
var toggleDesktopCommand = new IntPtr(0x7402);
IntPtr hWnd = IntPtr.Zero;
if (Environment.OSVersion.Version.Major < 6 || Environment.OSVersion.Version.Minor < 2) //7 and -
hWnd = GetWindow(FindWindow("Progman", "Program Manager"), GetWindow_Cmd.GW_CHILD);
else
{
IEnumerable<IntPtr> ptrs = FindWindowsWithClass("WorkerW");
int i = 0;
while (hWnd == IntPtr.Zero && i < ptrs.Count())
{
hWnd = FindWindowEx(ptrs.ElementAt(i), IntPtr.Zero, "SHELLDLL_DefView", null);
i++;
}
}
if (hWnd == IntPtr.Zero)
{
//"SHELLDLL_DefView" was not found as a child within WorkerW - Lets check the current ShellWindow
IntPtr desktop = GetShellWindow();
hWnd = FindWindowEx(desktop, IntPtr.Zero, "SHELLDLL_DefView", null);
}
if (hWnd != IntPtr.Zero)
{
SendMessage(hWnd, WM_COMMAND, toggleDesktopCommand, IntPtr.Zero);
}
}
static void Main(string[] args)
{
ToggleDesktopIcons();
}
}
更新:进程“SHELLDLL_DefView”是我们需要发送命令以切换图标的地方,这实际上是作为progman的孩子开始生活的。用户激活其他一些功能(不确定哪些功能,但Windows + Tab是一个)后,它将父项切换为WorkerW更改此代码以在currentShellWindow中检查
Dim wsh
Set wsh = CreateObject("Shell.Application")
wsh.ToggleDesktop 'show and hide the desktop
以上是关于我找到了一些显示/隐藏桌面图标的代码,但它会在此过程中移动图标。如何编辑代码以不移动图标?的主要内容,如果未能解决你的问题,请参考以下文章