2

我有一个场景,我需要组合一个脚本来为当前用户添加一个条目到以下注册表项:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU\

我正在尝试找出此键中允许的最大值数,以便我可以让我的脚本将另一个添加到末尾。值名称从字母表的开头开始,但我不想假设它们以“Z”结尾。

背景:我们正在重新打包专有(即不是我们自己的,我们无权访问源代码)应用程序并尝试设置其默认文件 -> 打开位置。在许多痛苦的快照和文件/Regmon 会话之后,这似乎是做到这一点的方法。我知道这很hackish,但它确实有效,我已经手动测试了这个理论。也就是说,我当然愿意接受有关如何以对 Win32 更友好的方式执行此操作的建议——假设应用程序本身没有更好的机制来执行此操作。

4

3 回答 3

8

对于每个可执行文件名称,此注册表项包含该应用程序上次执行 SaveAs(也许是 Save,我不确定)的目录。

每个字母都包含一个可执行文件的信息并MRUList包含顺序(这很重要)。

我的在“y”处被最大化,而我MRUList的是sxahmcjierfobglyuqpdtwvkn

根据实验,当我从已经存在的应用程序中执行 SaveAs 时,它只是替换该字母的信息并将其移动到MRUList.

如果应用程序不存在且并非所有字母都在 中MRUList,它会抓取第一个可用字母,将信息放入该字母中,然后将该字母放在MRUList.

如果应用程序不存在并且使用了所有字母,它会抓取 上的最后一个MRUList,将信息放入该字母中,然后将其移动到MRUList.

我注意到为一个全新的应用程序执行 SaveAs 不会给我这z封信,它会重新使用“MRUList”中的最后一个。

密钥本身看起来像 UCS-2(16 位 Unicode,在我的澳大利亚版本的 Windows 中散布空字节的 ASCII,您的里程可能因国际变体而异)并且它们包含以空字符结尾的可执行文件名称,然后是以空字符结尾的可执行文件名称目录。

关于您关于无法访问该应用程序源的评论,这并不重要。不是那个应用程序改变了这些键。ComDlg32 是 Windows 本身的常用对话框(打开、另存为、打印设置等)。

如果要为给定应用程序设置 MRU,请按照以下步骤操作。

1/ 在字母键中搜索该应用程序。如果找到,请转到步骤 3。

2/ 获取下一个不在MRUList. 如果 .MRUList已经包含所有字母ay 或者您不确定它y总是最后一个(它可能在注册表中的其他位置可配置),请抓住 . 末尾的最后一个字母MRUList

3/ 现在你收到了你的信。使用应用程序和目录的 UCS-2 数据更改或创建该字母键(均以 null 结尾)。

4/ 更改MRUList将您的字母放在前面。

那里。那应该这样做。

于 2009-05-12T04:45:46.290 回答
2

除非我误解了您的情况,否则标准的 Windows OpenFileDialog 应该有一个名为 的属性InitialDirectory,它指定对话框应该打开到的目录。

于 2009-05-06T01:16:59.450 回答
0

其他重要吗?我会考虑放弃其他人,或者重新使用第一个或最后一个。(我也会尝试使用任何字符,但幸运的是它可能会起作用。)

于 2009-05-15T20:01:43.683 回答