繁体   English   中英

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

[英]Windows registry key AppliesTo does not work with Users directory

我想做的是使用户在特定目录中的文件夹上单击鼠标右键时可以显示自定义的上下文菜单项。

因此,在HKEY_CLASSES_ROOT\\Directory\\shell我创建了我的密钥(例如,名称为MyProgram ),并创建了具有要运行的程序路径的子密钥command (例如,“ C:\\ Users \\ myuser \\ myApp \\ MyProgram”。可执行程序”)。

到现在为止还可以,并且可以正常工作。 但是,当我在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。

您还需要包括以下标题

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM