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