【问题标题】:How can I programmatically manipulate Windows desktop icon locations?如何以编程方式操作 Windows 桌面图标位置?
【发布时间】:2010-09-13 00:00:27
【问题描述】:

几年前,我天真地试图编写一个小应用程序来保存我在战术上放置的桌面图标,因为当某些事件重置它们时,我厌倦了将它们拖回原来的位置。在花费了太多时间未能找到查询方式(更不用说保存和重置图标的桌面位置)之后,我放弃了。

有谁知道 Windows 将这些信息保存在哪里以及是否有 API 可以设置它们?

谢谢, 理查德

【问题讨论】:

    标签: c# windows winapi icons utility


    【解决方案1】:

    我不知道 API,但我知道 Ultramon (http://www.realtimesoft.com/ultramon/) 具有保留图标位置的功能(虽然我从未使用它来保留图标位置,但它对于多显示器使用是必不可少的)。最新的 beta 版本可以完美地与 Vista 配合使用(除了最初通过 RDP 登录我的机器时有时会出现一两个小故障),当然,在 XP 上没有任何问题。我已经用了四年多了。

    我有没有提到它是多显示器使用的最佳实用程序?

    【讨论】:

      【解决方案2】:

      如果我没记错桌面只是一个 ListView,你必须将LVM_SETITEMPOSITION 消息发送到桌面的句柄。

      我用谷歌搜索了一些 c# 代码,但找不到示例,但我确实找到了以下文章。 Torry: ...get/set the positions of desktop icons?。它是 delphi 代码,但我发现它非常易读,并且通过一些 P/Invokes 你就可以将它翻译成 c#。

      【讨论】:

      • 我开始使用该代码作为基础,但在谷歌搜索时,发现我发布的链接作为答案,所以我会把答案归功于你,谢谢。
      • 嗨,我不太明白如何发送“消息”!此外不知道如何实现它 - 给定的例子对我没有帮助,因为没有解释书面代码。您能否举一个简短的示例,如何获取图标的位置并重新排列它们?感谢您的帮助
      【解决方案3】:

      桌面只是一个 ListView 控件,您可以使用 LVM_SETITEMPOSITION 获取它的句柄并向其发送消息以移动图标。

      不过,使用 LVMGETITEMPOS 获取图标位置有点复杂。您必须将指向 POINT 结构的指针作为 LPARAM 传递。如果您尝试这样做,您可能会导致 Explorer 崩溃。问题是您将地址空间中的指针传递给它,控件将其解释为资源管理器地址空间中的指针。哎哟!

      我使用的解决方案是将 DLL 注入 Explorer 进程并从那里发送消息。然后,您只需要有一种方法可以将职位信息返回到您的流程中。

      【讨论】:

      • 请注意,您可能不需要注入DLL:您可以从proc发送消息,并使用VirtualAllocEx和Read/WriteProcessMemory在explorer的进程空间中设置内存,这样您就可以拥有要使用的有效 LPARAM 指针(从资源管理器的角度来看)。这种方式避免了必须与您自己的进程通信或处理单独的 DLL。
      【解决方案4】:

      我仍在研究这个问题,一旦我最终得到一些工作,我会发布结果。我发布这个是因为间接感谢 Davy 的帖子,我还发现了一个经典的 VB 实现:

      Shuffle Desktop Icons Using Interprocess Memory Communication

      这可能是我的代码的基础。

      【讨论】:

        【解决方案5】:

        你想要这个吗?我在《WindowsCoreProgramming 5th》https://github.com/wang1902568721/WindowsCoreProgramming找到它

        【讨论】:

          猜你喜欢
          • 2011-11-18
          • 1970-01-01
          • 2019-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多