c# - 如何在 C# 中排列或排序桌面图标?

标签 c# sorting icons desktop sendmessage

您知道当您右键单击桌面时有一个“排序依据”选项,可以让您按“名称”、“大小”、“项目类型”或“修改日期”对图标进行排序吗?好吧,我想找到一种只需按一下按钮即可对桌面图标进行排序的方法。

我在 stackoverflow 上看到了一个类似的问题,但它很旧而且代码对我不起作用。问题的链接是:Arranging desktop icons with C# .我正在尝试在 Windows 10 中实现这一目标。

那里有评论说LVM_*和LVA_*值存储在SDK自带的commctrl.h文件中。由于某种原因,我找不到该文件。

这是我正在使用的:

  //sort desktop
     public const int LVM_ARRANGE = 4118;
     public const int LVM_ALIGNLEFT = 1;


     [DllImport("user32.dll", CharSet = CharSet.Auto)]
     public static extern IntPtr GetDesktopWindow(); 


    [DllImport("user32.dll")]
     public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

     //end of sort desktop 

private void organizeBtn_Click(object sender, EventArgs e)
   {
       var DesktopHandle = GetDesktopWindow();
       MessageBox.Show(GetDesktopWindow().ToString());

       SendMessage(GetDesktopWindow(), LVM_ARRANGE, LVM_ALIGNLEFT, 0);

   }

我一直在寻找关于这个主题的信息或某种方向,尤其是关于 Windows 10,但我找不到太多。请帮忙?

最佳答案

在 Windows 10 中,桌面(不是平铺世界!)仍然是 SysListView32,但是 GetDesktopWindow API 调用将返回其祖 parent 的句柄,一个 Progman 窗口 - 让人想起古老的“程序” Windows 3.0 的管理器”。然后是 SHELLDLL_DefView 类的垫片,在它下面您会发现隐藏了您想要的 ListView 。

使用the information from this answer从 shell 窗口向下移动到文件夹 View ,您最终可以发送 LVM_ARRANGE 消息。

这是一种脆弱的方法,因为它依赖于操作系统的未记录的属性,这些属性可能随时随着更新或新版本而改变。当用户使用幻灯片作为桌面背景时,它也可能会中断,因为 Windows 会重新排列桌面窗口堆栈。黑客处理这个here .

另一种被记录在案并且在未来版本中不太可能被破坏的方法,其缺点是涉及 COM 和 C# 的噩梦,是通过 shell 自动化的 IFolderView,两个相关发现 herehere .

关于c# - 如何在 C# 中排列或排序桌面图标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48390489/

相关文章:

c# - 正则表达式 - 比赛后只允许有空格或什么都没有

php - MySQL 查询 - 如何以某种方式对结果进行排序

ios - 如何在 iOS 中对大小字符串的 NSArray 进行排序?

Android imagebutton如何改变图标大小

css - 悬停在 icon-caret-down

linux - 在 Linux 可执行文件中嵌入图标

c# - FileStream Seek 在第二次调用大文件时失败

c# - 在特定时间启动和停止视频 Windows Media Player

c# - 如何从命令行发布 .Net Core ASP 便携版?

bash - 使用 'sort -g' bash 命令对带有指数的 float 进行排序