Ключ реестра Windows AppliesTo не работает с каталогом Users

То, что я пытаюсь сделать, — это включить настраиваемый элемент контекстного меню, когда пользователи щелкают правой кнопкой мыши папки в определенном каталоге.

Так в HKEY_CLASSES_ROOT\Directory\shell Я создал свой ключ (скажем, с именем: MyProgram), и я создал подраздел command там указан путь к моей программе (скажем, «C: \ Users \ myuser \ myApp \ MyProgram.exe»).

До сих пор это нормально и работает правильно. Но когда я добавляю запись AppliesTo под HKEY_CLASSES_ROOT\Directory\shell\MyProgram и установите его C:\Users это не работает, и пункт контекстного меню больше не появляется!

Важное примечание: мой язык Windows — немецкий, а отображаемое имя папки Users в моем проводнике Windows — Benutzer. Всякий раз, когда я устанавливаю AppliesTo в C:\Benutzer вместо этого он работает правильно, несмотря на то, что command работает с Users путь правильно! Также когда я echo %USERPROFILE% в CMD он печатается на английском языке как C:\Users\myuser а не Бенутцер.

Есть ли способ программно получить путь отображения пользователей или любой папки в системе?

Пожалуйста, обратите внимание: я не могу просто написать 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\""

0

Решение

Я нашел решение. Локализованные названия папок можно получить с помощью функции 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>
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]