2016-08-03 2 views
0

Я немного смущен тем, как уведомить свое приложение на C++ с событием, которое пользователь подключил к устройству (USB, HID и т. Д.). Тип приложения не определен. Я пытаюсь поиграть с приложениями приложения console/message-only/service, но результата нет. Я использую VS2015 и Windows, 10.Обнаружение установки внешних устройств в Windows

Я обнаружил, что существует несколько способов борьбы с ним:

  1. Использование WMI как here. Но я не могу понять, где WMI здесь.
  2. Использование 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); 
    

    Но никакого эффекта нет.

  3. Использование цикла while(true){...} и вызов соответствующих функций API Win API, таких как this answer. Но этот способ кажется не идеальным решением для моей проблемы.

Мои вопросы:

  1. Может кто-нибудь объяснить мне, что это лучший способ? И если это второй с RegisterDeviceNotification, почему он не работает в случае окна приложения только для сообщений?
  2. Существуют ли другие способы существования? А если нет, что я могу сделать, например, для уведомления приложения, когда какое-то определенное программное обеспечение было установлено?

Любые комментарии оцениваются.

+1

Окна только для сообщений - это общий шаблон в Win32. Не должно быть никаких проблем с консольным приложением, создающим окно только для сообщений, за исключением того, что вы можете сделать это в другом потоке, если ваш основной поток не управляется событиями. – immibis

+0

Когда вы говорите: «Я попробовал последний с примером из этого ответа», вы имеете в виду, что вы скомпилировали и использовали этот пример без каких-либо изменений, не так ли? – immibis

+0

@immibis да, я имел в виду это. Так что я должен создать новый поток для окна только для сообщений? – heyjohnnyfunt

ответ

0

Итак, я наконец нашел ответы на вопросы.

  1. Проблема была с GUID, который я предоставил для NotificationFilter.Поэтому я установил его для получения уведомлений со всех устройств с помощью этого кода: DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;

    ZeroMemory (& NotificationFilter, sizeof (NotificationFilter));

    NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); 
    NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; 
    // No need to set up dbcc_classguid as it is ignored when 
    // DEVICE_NOTIFY_ALL_INTERFACE_CLASSES is setted (see line down below) 
    
    HDEVNOTIFY dev_notify = RegisterDeviceNotification(hwnd, &NotificationFilter, DEVICE_NOTIFY_ALL_INTERFACE_CLASSES); 
    
  2. Что касается других видов уведомлений в окнах, что приложение может подписаться на, я нашел только один partially deprecated list of all Win32 API functions, где я нашел несколько новых уведомлений с Ctrl + F поиск :)

Надеюсь, это может спасти чье-то время.

Смежные вопросы