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