То, что я пытаюсь сделать, — это включить настраиваемый элемент контекстного меню, когда пользователи щелкают правой кнопкой мыши папки в определенном каталоге.
Так в 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\""
Я нашел решение. Локализованные названия папок можно получить с помощью функции 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>
Других решений пока нет …