版本 10
2025/10/9 9:36:44
问题分析
原来的C#实现使用的是 SendMessageTimeout 方法,这是一种同步调用,会等待所有窗口处理完消息才会返回。当系统负载较重时,这个过程会变得很慢,导致用户感觉界面刷新有延迟。
解决方案
我添加了一个新的刷新方法 RefreshExplorerMethod1Fast(),它使用 PostMessage API 替代 SendMessageTimeout。这种方法的特点是:
非阻塞调用:PostMessage 将消息放入目标窗口的消息队列后立即返回,不会等待消息被处理
立即执行:无论系统负载如何,调用都会立即完成
系统范围通知:仍然能够有效地通知所有顶层窗口主题已更改
具体修改内容
添加了 PostMessage API 的导入声明:
csharp
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern bool PostMessage(
IntPtr hWnd,
uint Msg,
IntPtr wParam,
IntPtr lParam);
实现了新的快速刷新方法 RefreshExplorerMethod1Fast():
使用 PostMessage 发送 WM_SETTINGCHANGE 消息
正确处理了字符串参数的内存分配和释放
这是一种非阻塞调用,不会等待其他程序处理完毕
更新了 RefreshExplorer() 方法:
在刷新方法列表中增加了新的快速方法
保持了原有的容错机制,如果快速方法失败还会尝试其他方法
现在,当系统繁忙时,程序会首先尝试原有的可靠但可能较慢的方法,如果耗时过长,则会使用新的快速刷新方式,从而确保在各种情况下都能快速响应用户的操作。
这个修改无需您进行任何额外操作,已经直接应用到了您的代码中。
操作人
|
时间
|
分值
|
意见及建议
|
状态变更 |
CL |
7天0小时前
|
|
(管理员审核)
|
已提交,待审核
→
已发布
|
*系统*
|
7天5小时前
|
|
(发布或更新动作)
|
已发布
→
已提交,待审核
|