如何以编程方式操作 Windows 桌面图标位置?

发布于 2024-07-06 14:58:27 字数 188 浏览 9 评论 0原文

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

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

谢谢, 理查德

Several years back, I innocently tried to write a little app to save my tactically placed desktop icons because I was sick of dragging them back to their locations when some event reset them. I gave up after buring WAY too much time having failed to find a way to query, much less save and reset, my icons' desktop position.

Anyone know where Windows persists this info and if there's an API to set them?

Thanks,
Richard

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

内心激荡 2024-07-13 14:58:28

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

我在 google 上搜索了一些 C# 代码,但找不到示例,但我确实找到了以下文章。 Torry:...获取/设置桌面图标的位置?。 它是 delphi 代码,但我发现它非常可读,并且通过一些 P/Invokes,您将能够将其转换为 c#。

If I'm not mistaken the desktop is just a ListView, and you'll have to send the LVM_SETITEMPOSITION message to the handle of the desktop.

I googled a bit for some c# code and couldn't find a example, but I did found the following article. Torry: ...get/set the positions of desktop icons?. It's delphi code, but I find it very readable and with some P/Invokes you'll be able to translate it to c#.

毁梦 2024-07-13 14:58:28

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

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

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

The desktop is just a ListView control and you can get its handle and send messages to it to move icons around using LVM_SETITEMPOSITION.

Getting icon positions using LVMGETITEMPOS is a bit more complicated, though. You have to pass a pointer to a POINT structure as your LPARAM. If you try to do that, you will likely crash Explorer. The problem is you passed it a pointer in your address space, which the control interpreted as a pointer in Explorer's address space. Ouch!

The solution I've used is to inject a DLL into the Explorer process and send the message from there. Then you just have to have a way to get the position info back to your process.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文