我发现一些显示/隐藏桌面图标的代码,但它在过程中移动了图标。如何编辑代码以不移动图标?

2023-12-05

我正在为 Rainmeter 使用两个批处理文件,一个用于隐藏所有图标,然后启动 Rainmeter,另一个用于显示所有图标并退出 Rainmeter,以使我的桌面再次看起来正常。

我的最终目标是将这两个批处理文件制作成任务栏上的按钮,我可以单击它们来切换桌面的外观。

到目前为止,我只有两个批处理文件,但它们所做的只是显示和隐藏桌面图标。 (我在网上找到了代码,因为我自己不会写)

show.bat

REG ADD "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /V HideIcons /T REG_DWORD /D 0 /F
taskkill /f /im explorer.exe
start explorer.exe

hide.bat

REG ADD "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /V HideIcons /T REG_DWORD /D 1 /F
taskkill /f /im explorer.exe
start explorer.exe

So 我发现代码工作正常但是比手动隐藏桌面图标要顺利得多...唯一的问题是,当我运行 show.bat 时,我的图标会回到我不希望它们所在的位置。

我怎样才能一,让批处理文件更顺利地显示/隐藏图标,二,不移动图标?

PS:只是想强调一下,我真的不知道我找到的代码是如何工作的,所以你可能需要 ELI5。


首先,TLDR: 我不认为你想要的在批处理文件中是可能的,所以我编译了一个小程序,每次运行时都会打开和关闭桌面图标,并且不会影响位置。https://github.com/smithmart/ToggleIcons/raw/main/ToggleIcons.exe

这要归功于堆栈溢出的另一个答案,但从你所说的来看,我认为你没有能力自己使用这个答案......所以我为你做了它。

ELI5:

我相信你的图标移动的原因是因为你正在使用taskkill来结束explorer.exe。 资源管理器是 Windows 中的程序,它运行您看到的大部分内容,例如开始栏和桌面,以及浏览驱动程序和文件夹时。

So,

taskkill /f /im explorer.exe

使 explorer.exe 停止运行,这就是为什么当您运行批处理时您会看到开始栏瞬间消失。 在这样停止它时,它没有机会保存您的图标位置,因此它们总是恢复到最后已知的位置。

您找到的脚本执行此操作的原因是停止 explorer.exe 然后再次启动它会刷新您的桌面,这意味着第一行:

REG ADD "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /V HideIcons /T REG_DWORD /D 1 /F

可以生效。此行将 Windows 中的设置更改为“隐藏我的桌面图标”

解决方案(某种) 我不知道刷新桌面设置的简单批处理文件的方法,但是,我确实在堆栈溢出上看到了这个答案,它是用 c# 编写的如何刷新/重新加载桌面

我知道你可能不具备使用这个答案的知识,所以我为你制作了一个小 exe 来切换你的图标

https://github.com/smithmart/ToggleIcons/raw/main/ToggleIcons.exe

它称为 ToggleIcons.exe 每次运行它时,它所做的只是打开或关闭桌面图标

要使用它,只需将其弹出到批处理文件所在的同一文件夹中并添加以下行:

切换图标.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 内检查

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我发现一些显示/隐藏桌面图标的代码,但它在过程中移动了图标。如何编辑代码以不移动图标? 的相关文章

  • 从 IPConfig 获取 IP 地址,稍后在代码中使用,或保存 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 是否可以运
  • 使用 py2exe 在 .exe 中嵌入图标,在 Vista 中可见?

    我一直在尝试使用 py2exe 将图标 ico 嵌入到我的 编译 exe 中 Py2Exe 确实有一种嵌入图标的方法 windows script MyScript py icon resources 1 MyIcon ico 这就是我正在
  • 批处理文件中的 %* 是什么意思?

    我见过的用法 在批处理文件和命令行中 有人可以解释一下的典型用法吗 有一个例子吗 它的意思是 命令行中的所有参数 例如 当您想要将命令行从批处理文件转发到另一个程序时 它非常有用 REM mybatchfile cmd echo You c
  • 如何更改 JAR 文件中的常规 JAVA COFFEE CUP 图标

    我可以更改框架中的 JAVA COFFEE CUP 图标 上 左 但如何更改 RUNNABLE JAR 文件的常规 JAVA COFFEE CUP 图片 是否有可能仅更改一个 JAR 文件的文件图标 谢谢 JAR 文件没有图标 操作系统为其
  • 如何创建 .bat 文件来运行 C# 代码?

    我需要的是 我有一个 C 代码 我想构建它以便在桌面上创建一个 bat 文件 因此 当我从桌面运行这个 bat 文件时 它应该执行 C 代码 有没有办法在编译之前更改 c 项目的设置或属性 以便创建应运行此 c 代码的 bat 文件 将 C
  • Windows 批处理文件中的 SQL 语句

    有没有办法让Windows批处理文件直接输入SQL语句而不需要调用脚本 我希望批处理文件登录SQL 然后直接输入语句 EDIT 我正在使用 Oracle v10g 对于单个命令 您可以使用以下技巧 echo select from dual
  • 在 ios 7 设备上获取多个应用程序图标

    我在 ios7 iPhone5 设备 上遇到一个奇怪的错误 我在ios7上使用xcode5安装了iPhone应用程序我的问题是每当我在设备上安装应用程序时 我都会收到多个应用程序图标 多次使用相同的名称 我还尝试通过我的系统使用不同的应用程
  • 批量设置变量=%变量:~1%是什么意思

    谁能解释一下是什么 1 在批处理文件中的以下语句中 我分配的值 variable到服务器名称并尝试过echo variable 我得到与输出相同的服务器名称 谁能解释一下下面的语句是如何工作的 set variable variable 1
  • Android 自定义对话框中的图标

    有没有一种方法可以在不使用 AlertDialog 方法的情况下在自定义对话框上设置图标 对话框有标题 但缺少漂亮的分隔线和设置图标的功能 但肯定有一种方法可以在不使用 AlertDialog 的情况下获得两者 您可以使用以下代码添加图标
  • 在批处理脚本中发送 Windows 密钥

    我最近一直在使用SendKeys使用批处理脚本的函数 我已经了解如何在窗口中输入某些键 例如 Tab 键 SendKeys TAB 或者退格键 SendKeys BACKSPACE 但我一直尝试在不按Windows键的情况下输入它 不幸的是
  • 批处理:在特定程序中打开特定文件?

    当记事本是 txt 文件的默认程序时 如何告诉 Windows 在写字板中打开 C test test txt 接受的答案对我不起作用 我不确定这是因为我试图运行的程序 还是因为路径中有空格 即使我用引号引起来 或者其他原因 不管怎样 我可
  • 具有桌面应用程序安全性的 OAuth2

    我有一个 Electron 应用程序 它基本上是一个 Google Drive 客户端 我打算使用 OAuth 2 但是 Google API 要求我在生成 client secret 的地方注册我的应用程序 由于这是一个桌面应用程序 因此
  • 如何获取与文件类型关联的图标路径和索引?

    给定一个文件类型 例如 txt 我怎样才能得到 path index 文件类型的关联图标路径和索引 例如 我想转换 txt into Path SystemRoot system32 imageres dll Index 102 有了这些信
  • Swift 和 Xcode - 如何创建自定义选项卡栏图标

    我正在用 Swift 编写的 Xcode 中处理一个选项卡式应用程序项目 Xcode 6 3 and Swift 1 2 我在使用自定义选项卡栏图标时遇到很多麻烦 我在 Photoshop CS6 中设计了一张图像 将其保存为 PNG 在
  • 如何以编程方式在导航栏中设置图片?

    我有一个带有导航栏的详细视图 其中带有后退按钮和视图名称 导航栏以编程方式设置 呈现的名称是这样设置的 self title NSLocalizedString name 该名称取决于所呈现的视图 现在我还想在导航栏上显示一个小图标 这也取
  • 需要帮助通过批处理文件添加注册表项

    我正在尝试通过cmd添加以下注册表项 我无法让其他用户能够使用以下命令添加此注册表项regedit exe s Location Project reg HKEY CURRENT USER Software Autodesk Fabrica
  • 如何消除批处理文件动画中的闪烁? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 因此 我一直在批量制作一个假 GUI 以作为我正在做的 YouTube 评论的结尾 它基本上是一堆方框
  • 垫子图标不显示图标

    我喜欢有角度的材料的设计 但使用它可能会很痛苦 该网站展示了一个使用的示例
  • 使用 Windows 批处理文件在文本文件中添加新行

    我有一个文本文件 其中有 200 多行 我只想在第 4 行之前添加一个新行 我使用的是 Windows XP 输入前的示例文本文件 header 1 header 2 header 3 details 1 details 2 输出后 hea
  • 批处理脚本生成特定年月、周和工作日的文件夹

    最近几天我一直在寻找这个问题的答案 有很多关于全年批量文件夹创建的答案 但不够具体 所以我非常感谢答案 所以我想要这样的文件夹结构 如下所示 2017 for example main folder for year 2017 01 JAN

随机推荐