几年前,我天真地尝试编写一个小应用程序来保存我在战术上放置的桌面图标,因为当某些事件重置它们时,我厌倦了将它们拖回原来的位置。在花费了太多时间未能找到查询方式(更不用说保存和重置图标的桌面位置)之后,我放弃了。
任何人都知道 Windows 将这些信息保存在哪里以及是否有 API 来设置它们?
谢谢,理查德
如果我没记错桌面只是一个 ListView,你必须将LVM_SETITEMPOSITION消息发送到桌面的句柄。
我用谷歌搜索了一些 c# 代码,但找不到示例,但我确实找到了以下文章。Torry: ...获取/设置桌面图标的位置?. 它是 delphi 代码,但我发现它非常易读,并且通过一些 P/Invokes,您将能够将其翻译成 c#。
桌面只是一个 ListView 控件,您可以使用 LVM_SETITEMPOSITION 获取它的句柄并向其发送消息以移动图标。
不过,使用 LVMGETITEMPOS 获取图标位置有点复杂。您必须将指向 POINT 结构的指针作为 LPARAM 传递。如果您尝试这样做,您可能会导致 Explorer 崩溃。问题是您在地址空间中向它传递了一个指针,控件将其解释为资源管理器地址空间中的指针。哎哟!
我使用的解决方案是将 DLL 注入 Explorer 进程并从那里发送消息。然后,您只需要有一种方法可以将职位信息返回到您的流程中。
我仍在研究这个问题,一旦我最终得到一些工作,我就会发布结果。我发布这个是因为间接感谢 Davy 的帖子,我还发现了一个经典的 VB 实现:
这可能是我的代码的基础。
我不知道 API,但我知道 Ultramon ( http://www.realtimesoft.com/ultramon/ ) 具有保留图标位置的功能(虽然我从未使用它来保留图标位置,但它是必不可少的用于多显示器使用)。最新的 beta 版本在 Vista 上完美运行(除了最初通过 RDP 登录我的机器时有时会出现一两个小故障),当然,在 XP 上没有任何问题。我已经用了四年多了。
我有没有提到它是多显示器使用的最佳实用程序?
也许你想要这个?我在《WindowsCoreProgramming 5th》https://github.com/wang1902568721/WindowsCoreProgramming