MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Как получить список приложений эквивалентный меню Открыть с помощью"
Answer 910456
Диалог "Открыть с помощью" отображает не список всех установленных приложений, он составляет список приложений на основе двух источников:
- Приложения, перечисленные в ключе реестра
HKEY_CLASSES_ROOT\Applications
, для которых не определен параметр NoOpenWith.- Приложения, зарегистрированные для конкретного расширения файлов в следующих ключах:
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.(расширение)\OpenWithProgids HKCU\Software\Classes\.(расширение)\OpenWithProgids HKCU\Software\Classes\.(расширение)\OpenWithList
Чтобы перейти от имени exe-файла к его полному пути, нужно найти его в одной из следующих веток:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\App Paths\ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\
Далее, значок приложения и его читаемое описание обычно нигде в реестре явно не прописаны и берутся из ресурсов EXE-файла.
Для получения значка можно использовать функцию ExtractIcon
Для получения описания можно использовать функцию VerQueryValue, передавая в качестве пути к ресурсу строку вида
\StringFileInfo\lang-codepage\FileDescription
.Для примера, вывод списка программ из
HKEY_CLASSES_ROOT\Applications
:#include <stdio.h> #include <stdlib.h> #include <windows.h> #define MAX_KEY_LENGTH 255 #define MAX_VALUE_NAME 16383 void QueryKey(HKEY hKey) { wchar_t achKey[MAX_KEY_LENGTH]; // buffer for subkey name DWORD cbName; // size of name string wchar_t achClass[MAX_PATH] = L""; // buffer for class name DWORD cchClassName = MAX_PATH; // size of class string DWORD cSubKeys=0; // number of subkeys DWORD cbMaxSubKey; // longest subkey size DWORD cchMaxClass; // longest class string DWORD cValues; // number of values for key DWORD cchMaxValue; // longest value name DWORD cbMaxValueData; // longest value data DWORD cbSecurityDescriptor; // size of security descriptor FILETIME ftLastWriteTime; // last write time DWORD type; DWORD cdata; HKEY hSubkey; DWORD i, retCode; wchar_t achValue[MAX_VALUE_NAME]; DWORD cchValue = MAX_VALUE_NAME; // Get the class name and the value count. retCode = RegQueryInfoKey( hKey, // key handle achClass, // buffer for class name &cchClassName, // size of class string NULL, // reserved &cSubKeys, // number of subkeys &cbMaxSubKey, // longest subkey size &cchMaxClass, // longest class string &cValues, // number of values for this key &cchMaxValue, // longest value name &cbMaxValueData, // longest value data &cbSecurityDescriptor, // security descriptor &ftLastWriteTime); // last write time // Enumerate the subkeys if (cSubKeys == 0) { wprintf(L"Error: no subkeys!\n",achKey); } else { for (i=0; i<cSubKeys; i++) { cbName = MAX_KEY_LENGTH; retCode = RegEnumKeyEx(hKey, i, achKey, &cbName, NULL, NULL, NULL, &ftLastWriteTime); if (retCode != ERROR_SUCCESS) continue; retCode = RegOpenKey(hKey,achKey,&hSubkey); if(retCode != ERROR_SUCCESS){ wprintf(L"%s: RegOpenKey failed\n",achKey); continue; } retCode = RegQueryValueEx(hSubkey,L"NoOpenWith",NULL,&type,NULL,&cdata); if(retCode == ERROR_FILE_NOT_FOUND){ wprintf(TEXT("%s\n"), achKey); } RegCloseKey(hSubkey); } } } int main(int argc, char **argv) { HKEY hTestKey; if( RegOpenKeyEx( HKEY_CLASSES_ROOT, L"Applications", 0, KEY_READ, &hTestKey) == ERROR_SUCCESS ) { QueryKey(hTestKey); } RegCloseKey(hTestKey); getchar(); return 0; }
Источники:
How to Exclude an Application from the Open With Dialog Box for Unassociated File Types
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.