Russian Qt Forum
Ноябрь 26, 2024, 10:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как подписать программу на сообщения Windows (WM_MESSAGE)?  (Прочитано 7610 раз)
gf59
Гость
« : Сентябрь 29, 2009, 10:36 »

Всем привет!

Вообще-то нужное мне сообщение получается (WM_DEVICECHANGE - изменения в хардваре), но только когда wParam = DBT_DEVNODES_CHANGED (подключение или отключение устройства)
А мне бы хотелось получать параметр именно отключения (wParam = DBT_DEVICEREMOVECOMPLETE)
В MSDN написано, что это можно сделать с помощью функции RegisterDeviceNotification.

Как можно это сделать в QT?
Может, здесь есть другие способы подписаться на сообщения?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Сентябрь 29, 2009, 11:14 »

Цитировать
Как можно это сделать в QT?
Цитировать
В MSDN написано, что это можно сделать с помощью функции RegisterDeviceNotification.
Записан

ArchLinux x86_64 / Win10 64 bit
gf59
Гость
« Ответ #2 : Сентябрь 29, 2009, 15:46 »

Да, но кьют не видит этой функции

Хотя строчка #include <windows.h> есть
И user32.lib в проект включил
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Сентябрь 29, 2009, 15:57 »

не может быть!!!

эта функция объявлена в minGW  в файле winuser.h

попробуйте вставить #include <qt_windows.h> вместо #include <windows.h>

Чем компилируете? Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
gf59
Гость
« Ответ #4 : Сентябрь 29, 2009, 16:40 »

То же самое - при компиляции получаю
error: `RegisterDeviceNotificationW' was not declared in this scope
Компилирую средствами по умолчанию
Версия - QT Creator 1.2.1 (QT 4.5.2)

Кстати в списке доступных выражений (который выпадает по Ctrl+Пробел) RegisterDeviceNotification есть
Но он там виден не как функция
Не знаю, что значит эта иконка, в прямоугольнике написано "abc"
Записан
Rcus
Гость
« Ответ #5 : Сентябрь 29, 2009, 16:55 »

Код:
main@krchome:~/Рабочий стол/w32api-3.13-mingw32$ grep RegisterDeviceNotification **/*.h -n
include/winuser.h:3929:WINUSERAPI HDEVNOTIFY WINAPI RegisterDeviceNotificationA(HANDLE,LPVOID,DWORD);
include/winuser.h:3930:WINUSERAPI HDEVNOTIFY WINAPI RegisterDeviceNotificationW(HANDLE,LPVOID,DWORD);
include/winuser.h:4247:#define RegisterDeviceNotification RegisterDeviceNotificationW
include/winuser.h:4412:#define RegisterDeviceNotification RegisterDeviceNotificationA
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #6 : Октябрь 09, 2009, 23:30 »

Цитировать
Minimum supported client   Windows 2000 Professional

Перед включением виндовых заголовков вставь

Код:
#define _WIN32_WINNT 0x0500
#define WINVER 0x0500

Использование функции -

Код:
Class::Class() : QWidget()
{

...

    DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;

    memset(&NotificationFilter, 0, sizeof(NotificationFilter));
    NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
    NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
    NotificationFilter.dbcc_classguid = MyGUID;

    HDEVNOTIFY hDeviceNotify = RegisterDeviceNotification(winId(), &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);

    if(hDeviceNotify == NULL)
        qWarning("Device autodetection won't be supported");
}

bool Class::winEvent(MSG *message, long *result)
{
    if(message->message == WM_DEVICECHANGE)
    {
        switch(message->wParam)
        {
            case DBT_DEVICEARRIVAL:
            case DBT_DEVICEREMOVECOMPLETE:
            {
                DEV_BROADCAST_HDR *hdr = reinterpret_cast<DEV_BROADCAST_HDR *>(message->lParam);

                if(hdr && hdr->dbch_devicetype == DBT_DEVTYP_VOLUME)
                { /* появился или удалился новый раздел, делаем свои чёрные делишки тут */ }
            }
            break;
        }
    }

    return false;
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.087 секунд. Запросов: 22.