#cpp #windows #winapi
Как на С++ получить список установленных в Windows приложений, аналогичных тому, что появляется при нажатии в контекстном меню мыши "Открыть с помощью..." в виде: <иконка или путь к иконке>, <путь к .exe файлу приложения>, <Человекочитаемое название приложения>? Программирую в Qt Creator.
Ответы
Ответ 1
Диалог "Открыть с помощью" отображает не список всех установленных приложений, он составляет список приложений на основе двух источников: Приложения, перечисленные в ключе реестра 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#include #include #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
Комментариев нет:
Отправить комментарий