Russian Qt Forum

Qt => Общие вопросы => Тема начата: gf59 от Сентябрь 29, 2009, 10:36



Название: Как подписать программу на сообщения Windows (WM_MESSAGE)?
Отправлено: gf59 от Сентябрь 29, 2009, 10:36
Всем привет!

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

Как можно это сделать в QT?
Может, здесь есть другие способы подписаться на сообщения?


Название: Re: Как подписать программу на сообщения Windows (WM_MESSAGE)?
Отправлено: kuzulis от Сентябрь 29, 2009, 11:14
Цитировать
Как можно это сделать в QT?
Цитировать
В MSDN написано, что это можно сделать с помощью функции RegisterDeviceNotification.


Название: Re: Как подписать программу на сообщения Windows (WM_MESSAGE)?
Отправлено: gf59 от Сентябрь 29, 2009, 15:46
Да, но кьют не видит этой функции

Хотя строчка #include <windows.h> есть
И user32.lib в проект включил


Название: Re: Как подписать программу на сообщения Windows (WM_MESSAGE)?
Отправлено: kuzulis от Сентябрь 29, 2009, 15:57
не может быть!!!

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

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

Чем компилируете? :)


Название: Re: Как подписать программу на сообщения Windows (WM_MESSAGE)?
Отправлено: gf59 от Сентябрь 29, 2009, 16:40
То же самое - при компиляции получаю
error: `RegisterDeviceNotificationW' was not declared in this scope
Компилирую средствами по умолчанию
Версия - QT Creator 1.2.1 (QT 4.5.2)

Кстати в списке доступных выражений (который выпадает по Ctrl+Пробел) RegisterDeviceNotification есть
Но он там виден не как функция
Не знаю, что значит эта иконка, в прямоугольнике написано "abc"


Название: Re: Как подписать программу на сообщения Windows (WM_MESSAGE)?
Отправлено: Rcus от Сентябрь 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


Название: Re: Как подписать программу на сообщения Windows (WM_MESSAGE)?
Отправлено: Alex Custov от Октябрь 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;
}