清除Windows的"运行"对话框历史记录而无需重新启动

时间:2020-03-06 14:44:11  来源:igfitidea点击:

我当前正在开发一个程序,以立即清除Windows开始->运行对话框中显示的先前运行命令的列表。删除HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ RunMRU密钥以清除此列表的过程已得到很好的记录;但是,在这些更改生效之前,似乎有必要执行以下操作之一:

  • 重新启动电脑
  • 选择开始->关闭,然后选择取消。

这些都不是我要完成的任务的理想选择:#1对用户极具破坏性,并且#2似乎需要额外的用户交互。

有谁知道如何立即(以编程方式)强制重新加载此信息,而无需任何用户交互,同时又将对用户其他活动的干扰降到最低?我希望在执行程序后立即清除用户的运行历史记录,而无需他们进一步采取任何措施(例如,使用上述#2中的"关闭"->"取消"技巧)或者强制重新启动。

或者,从另一个角度解决问题:单击"开始"->"关机"->"取消"时,Windows资源管理器将重新加载RunMUI项。有没有一种方法可以强制类似的重载而无需用户选择"关机"然后"取消"?

我已经尝试过的事情:

  • 在选择"关机"然后"取消"的同时,使用procmon监视explorer.exe的状态。我看到资源管理器正在写入RunMRU密钥,但无法确定是什么触发了此事件。
  • 大量的Google搜索都遵循"无需重新启动即可重新加载runmru"的路线。大多数结果仍建议使用上面的方法1,尽管少数结果建议使用方法2.
  • 受限的MSDN API检查。 RegFlushKey调用看起来很有希望,但是我以前从未使用过它,因此我不知道它是否将应用于不同进程缓存的注册表信息。

任何建议或者其他信息将不胜感激。

解决方案

不能完全回答问题,但是我确实从PC Mag的这篇文章中找到了触发清除运行命令的第三种方法。

注册表修改后,杀死explorer.exe,然后重新启动它也将清除运行列表。

HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ RunMRU \

我为我们准备了一个令人讨厌的技巧。以编程方式显示该窗口,立即(以编程方式)将其隐藏,然后在其上单击"取消"(以编程方式我们猜到了)。

我们可以尝试寻找图标缓存刷新API或者其他API,如果它们具有我们所寻找的副作用,我也不会感到惊讶。

我见过一些实例,即使F5键也不起作用?试试这个,按ctrl> alt> delete,然后转到任务管理器,处理选项卡...结束explorer.exe。然后单击文件新任务,然后键入explorer.exe,然后检查...是否行得通?

Windows XP

  • 右键单击任务栏
  • 属性菜单选项
  • 开始菜单标签
  • 自定义按钮
  • 程序窗格
  • 清晰的列表
  • 点击确定

这将调用Windows API函数,该函数将刷新explorere.exe任务栏过程并清除列表(无需注册表编辑)。

我们尝试过ccleaner吗?

http://www.ccleaner.com/

据我所知,它依赖于托管开始菜单/任务栏/桌面已关闭并重新打开的explorer.exe进程。据我所知,没有"干净"的方法可以做到这一点。

如果确实需要在没有用户交互的情况下执行此操作,则需要关闭所有explorer.exe进程并重新启动一个进程。

这是一个基本的Cprogram来做到这一点;

using System.Diagnostics;

  Process[] procs = Process.GetProcessesByName("explorer");
  foreach (Process proc in procs)
  {
    proc.Kill();
  }

  Process.Start("explorer.exe");

请注意,这将关闭所有打开的" Windows资源管理器"窗口,并且此后可能会或者可能不会打开其他" Windows资源管理器"。

我刚刚在Windows XP 32bit上进行了测试,并且确实清除了Run命令缓存。