Windows 注册表项 AppliesTo 不适用于用户目录

Windows registry key AppliesTo does not work with Users directory

我想做的是在用户右键单击特定目录中的文件夹时启用自定义上下文菜单项。

所以在 HKEY_CLASSES_ROOT\Directory\shell 中我创建了我的密钥(比如名称:MyProgram),并且我创建了子密钥 command,它具有我的程序路径到 运行(比如,"C:\Users\myuser\myApp\MyProgram.exe")。

到现在为止一切正常,工作正常。但是当我在 HKEY_CLASSES_ROOT\Directory\shell\MyProgram 下添加条目 AppliesTo 并将其设置为 C:\Users 它不起作用并且上下文菜单项不再出现!

重要说明:我的 windows 语言是德语,我的 windows 资源管理器中的用户文件夹显示名称是 Benutzer。每当我将 AppliesTo 设置为 C:\Benutzer 时它都可以正常工作,尽管 command 可以与 Users 路径一起正常工作!此外,当我在 cmd 中 echo %USERPROFILE% 时,它以英文打印为 C:\Users\myuser 而不是 Benutzer。

有没有办法以编程方式获取用户或系统中任何文件夹的显示路径?

请注意:我不能简单地在路径中写 Benutzer 而不是 Users,因为路径可以是动态的。我以编程方式执行此操作,并希望我的代码在使用不同语言的不同机器上具有 一致的行为 。我正在使用 C++ winreg API 设置注册表值(例如:RegOpenKeyEx() 和 RegSetValueEx())。

下面是密钥工作版本的导出:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\MyProgram]
"AppliesTo"="C:\Benutzer\myuser"

[HKEY_CLASSES_ROOT\Directory\shell\MyProgram\command]
@="\"C:\Users\myuser\path\to\MyProgram.exe\" \"%1\""

我找到了解决方案。文件夹的本地化名称可以使用函数 SHGetLocalizedName 获取,但是需要一些额外的工作才能获取本地化名称的字符串表示形式。以下代码片段显示了如何执行此操作的示例。

PWSTR name = new WCHAR[100];;
PCWSTR folder = TEXT("C:\Users");
UINT len=100;
int id=0;

HRESULT hr = SHGetLocalizedName(folder, name, len, &id);

if (SUCCEEDED(hr)) {
    wprintf(L"%ls\n", name);
    ExpandEnvironmentStrings(name, name, len);
    HMODULE shell_handle = LoadLibraryEx(name, NULL, DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE);
    if (shell_handle) {
        if (LoadString(shell_handle, id, name, len) != 0) {
            wprintf(L"%ls\n", name);
        }
        FreeLibrary(shell_handle);
    }
}

如果是德语语言环境,前面代码的结果将是 Benutzer。

您还需要包括以下内容headers

#include <wchar.h>
#include <Shellapi.h>