Я немного смущен тем, как уведомить свое приложение на C++ с событием, которое пользователь подключил к устройству (USB, HID и т. Д.). Тип приложения не определен. Я пытаюсь поиграть с приложениями приложения console/message-only/service, но результата нет. Я использую VS2015 и Windows, 10.Обнаружение установки внешних устройств в Windows
Я обнаружил, что существует несколько способов борьбы с ним:
- Использование WMI как here. Но я не могу понять, где WMI здесь.
Использование RegisterDeviceNotification и WM_DEVICECHANGE. Насколько я понимаю, для консольных приложений нет возможности сделать это только один раз с графическим интерфейсом (реальное окно) или для окна только для сообщений. Я пробовал последний с примера с this answer, но мое приложение не получает никаких уведомлений, когда я подключаю свой USB-накопитель. Я нашел this answer (с тем же вопросом, что и ответ упомянутый выше) и пытался использовать функцию ChangeWindowMessageFilterEx() с GetProcAddress из user32.dll, чтобы загрузить его без подключения DLL мое приложение таким образом:
BOOL InitInstance(HWND hWnd) { HMODULE hDll = GetModuleHandle(TEXT("user32.dll")); if (hDll) { typedef BOOL(WINAPI *MESSAGEFILTERFUNCEX)(HWND hWnd, UINT message, DWORD action, VOID* pChangeFilterStruct); const DWORD MSGFLT_ALLOW = 1; MESSAGEFILTERFUNCEX ChangeWindowMessageFilterEx= (MESSAGEFILTERFUNCEX)::GetProcAddress(hDll, "ChangeWindowMessageFilterEx"); if (ChangeWindowMessageFilterEx) return func(hWnd, WM_COPYDATA, MSGFLT_ALLOW, NULL); } return FALSE; }
И использование этой функции:
hWnd = CreateWindowEx(0, CLS_NAME, "DevNotifWnd", WS_ICONIC, 0, 0, CW_USEDEFAULT, 0, HWND_MESSAGE, NULL, GetModuleHandle(0), (void*)&guid); InitInstance(hWnd);
Но никакого эффекта нет.
Использование цикла
while(true){...}
и вызов соответствующих функций API Win API, таких как this answer. Но этот способ кажется не идеальным решением для моей проблемы.
Мои вопросы:
- Может кто-нибудь объяснить мне, что это лучший способ? И если это второй с RegisterDeviceNotification, почему он не работает в случае окна приложения только для сообщений?
- Существуют ли другие способы существования? А если нет, что я могу сделать, например, для уведомления приложения, когда какое-то определенное программное обеспечение было установлено?
Любые комментарии оцениваются.
Окна только для сообщений - это общий шаблон в Win32. Не должно быть никаких проблем с консольным приложением, создающим окно только для сообщений, за исключением того, что вы можете сделать это в другом потоке, если ваш основной поток не управляется событиями. – immibis
Когда вы говорите: «Я попробовал последний с примером из этого ответа», вы имеете в виду, что вы скомпилировали и использовали этот пример без каких-либо изменений, не так ли? – immibis
@immibis да, я имел в виду это. Так что я должен создать новый поток для окна только для сообщений? – heyjohnnyfunt