Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
Pjeroo
Землянин
34 / 34 / 16
Регистрация: 15.01.2013
Сообщений: 313
1

Отслеживание события подключения флешки

06.03.2014, 13:49. Просмотров 1115. Ответов 2
Метки нет (Все метки)

Есть несколько вопросов:
1. Для отслеживания происходящего в Windows (в данном случае WM_CHANGEDEVICE) всегда ли необходимо создавать окно?

2. Если 1 да, то как можно сократить процесс создания окна до минимума? Все равно настройки ведь не особо важны, окно же скрыто.

3. Code::Blocks не знает структуры DEV_BROADCAST_DEVICEINTERFACE и значния DBT_DEVTYP_DEVICEINTERFACE, хотя в dbt.h они явно прописаны. Я даже строку #define _WIN32_WINNT 0x0500 специально добавил, а он все равно ни в какую. Что делать?

4. Почему строка int devType = data->dbch_devicetype; выдает не красивые значения вроде 0x00000005, 0x00000006 и.т.д, а какое-то очень длинное число 4199778?

Пока все.

main.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <dbt.h>
#include <winuser.h>
#define DBT_DEVTYP_DEVICEINTERFACE      0x00000005  // device interface class
 
#define _WIN32_WINNT 0x0500
 
using namespace std;
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);
 
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, PSTR szCmdLine, int iCmdShow)
{
    char azAppName[] = "Test";
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wndclass;
 
    wndclass.cbSize = sizeof(wndclass);
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbWndExtra = 0;
    wndclass.cbClsExtra = 0;
    wndclass.hInstance = hInst;
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    wndclass.lpszClassName = NULL;
    wndclass.lpszClassName = azAppName;
    wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
 
    RegisterClassEx(&wndclass);
 
    hwnd = CreateWindow(azAppName, "TEST", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL);
 
    ShowWindow(hwnd, SW_HIDE);
    UpdateWindow(hwnd);
 
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;
 
    switch(iMsg)
    {
        case WM_DEVICECHANGE:
            if (wParam == DBT_DEVICEARRIVAL)
            {
                cout << "Connected by USB\n";
 
                DEV_BROADCAST_HDR *data = (DEV_BROADCAST_HDR*)&lParam;
                int devType = data->dbch_devicetype;
                cout << devType;
            }
            if (wParam == DBT_DEVICEREMOVECOMPLETE)
                cout << "Removed by USB";
            return 0;
    }
    return DefWindowProc(hwnd, iMsg, wParam, lParam);
}


dbt.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#ifndef _DBT_H
#define _DBT_H
#if __GNUC__ >=3
#pragma GCC system_header
#endif
 
#ifdef __cplusplus
extern "C" {
#endif
#define DBT_NO_DISK_SPACE   0x47
#define DBT_CONFIGMGPRIVATE 0x7FFF
#define DBT_DEVICEARRIVAL   0x8000
#define DBT_DEVICEQUERYREMOVE   0x8001
#define DBT_DEVICEQUERYREMOVEFAILED 0x8002
#define DBT_DEVICEREMOVEPENDING 0x8003
#define DBT_DEVICEREMOVECOMPLETE    0x8004
#define DBT_DEVICETYPESPECIFIC  0x8005
#define DBT_DEVTYP_OEM  0
#define DBT_DEVTYP_DEVNODE  1
#define DBT_DEVTYP_VOLUME   2
#define DBT_DEVTYP_PORT 3
#define DBT_DEVTYP_NET  4
#if (_WIN32_WINDOWS >= 0x0410 || _WIN32_WINNT >= 0x0500)
#define DBT_DEVTYP_DEVICEINTERFACE 5
#define DBT_DEVTYP_HANDLE 6
#endif /* (_WIN32_WINDOWS >= 0x0410 || _WIN32_WINNT >= 0x0500) */
#define DBT_APPYBEGIN 0
#define DBT_APPYEND 1
#define DBT_DEVNODES_CHANGED 7
#define DBT_QUERYCHANGECONFIG 0x17
#define DBT_CONFIGCHANGED 0x18
#define DBT_CONFIGCHANGECANCELED 0x19
#define DBT_MONITORCHANGE 0x1B
#define DBT_SHELLLOGGEDON 32
#define DBT_CONFIGMGAPI32 34
#define DBT_VXDINITCOMPLETE 35
#define DBT_VOLLOCKQUERYLOCK 0x8041
#define DBT_VOLLOCKLOCKTAKEN 0x8042
#define DBT_VOLLOCKLOCKFAILED 0x8043
#define DBT_VOLLOCKQUERYUNLOCK 0x8044
#define DBT_VOLLOCKLOCKRELEASED 0x8045
#define DBT_VOLLOCKUNLOCKFAILED 0x8046
#define DBT_USERDEFINED 0xFFFF
#define DBTF_MEDIA  1
#define DBTF_NET    2
 
/* Also defined in winuser.h */
#define BSM_ALLCOMPONENTS   0
#define BSM_APPLICATIONS    8
#define BSM_ALLDESKTOPS     16
#define BSM_INSTALLABLEDRIVERS  4
#define BSM_NETDRIVER   2
#define BSM_VXDS    1
#define BSF_FLUSHDISK 0x00000004
#define BSF_FORCEIFHUNG 0x00000020
#define BSF_IGNORECURRENTTASK 0x00000002
#define BSF_NOHANG 0x00000008
#define BSF_NOTIMEOUTIFNOTHUNG 0x00000040
#define BSF_POSTMESSAGE 0x00000010
#define BSF_QUERY 0x00000001
#if (_WIN32_WINNT >= 0x0500)
#define BSF_ALLOWSFW 0x00000080
#define BSF_SENDNOTIFYMESSAGE 0x00000100
#endif /* (_WIN32_WINNT >= 0x0500) */
#if (_WIN32_WINNT >= 0x0501)
#define BSF_LUID 0x00000400
#define BSF_RETURNHDESK 0x00000200
#endif /* (_WIN32_WINNT >= 0x0501) */
 
#define BSF_MSGSRV32ISOK_BIT 31
#define BSF_MSGSRV32ISOK 0x80000000
 
typedef struct _DEV_BROADCAST_HDR {
    DWORD dbch_size;
    DWORD dbch_devicetype;
    DWORD dbch_reserved;
} DEV_BROADCAST_HDR,*PDEV_BROADCAST_HDR;
typedef struct _DEV_BROADCAST_OEM {
    DWORD dbco_size;
    DWORD dbco_devicetype;
    DWORD dbco_reserved;
    DWORD dbco_identifier;
    DWORD dbco_suppfunc;
} DEV_BROADCAST_OEM,*PDEV_BROADCAST_OEM;
typedef struct _DEV_BROADCAST_PORT_A {
    DWORD dbcp_size;
    DWORD dbcp_devicetype;
    DWORD dbcp_reserved;
    char dbcp_name[1];
} DEV_BROADCAST_PORT_A, *PDEV_BROADCAST_PORT_A;
typedef struct _DEV_BROADCAST_PORT_W {
    DWORD dbcp_size;
    DWORD dbcp_devicetype;
    DWORD dbcp_reserved;
    wchar_t dbcp_name[1];
} DEV_BROADCAST_PORT_W, *PDEV_BROADCAST_PORT_W;
typedef struct _DEV_BROADCAST_USERDEFINED {
    struct _DEV_BROADCAST_HDR dbud_dbh;
    char dbud_szName[1];
} DEV_BROADCAST_USERDEFINED;
typedef struct _DEV_BROADCAST_VOLUME {
    DWORD dbcv_size;
    DWORD dbcv_devicetype;
    DWORD dbcv_reserved;
    DWORD dbcv_unitmask;
    WORD dbcv_flags;
} DEV_BROADCAST_VOLUME,*PDEV_BROADCAST_VOLUME;
 
#ifdef UNICODE
typedef DEV_BROADCAST_PORT_W DEV_BROADCAST_PORT, *PDEV_BROADCAST_PORT;
#else
typedef DEV_BROADCAST_PORT_A DEV_BROADCAST_PORT, *PDEV_BROADCAST_PORT;
#endif
 
#if (_WIN32_WINDOWS >= 0x0410 || _WIN32_WINNT >= 0x0500)
typedef struct _DEV_BROADCAST_DEVICEINTERFACE_A {
 DWORD dbcc_size;
 DWORD dbcc_devicetype;
 DWORD dbcc_reserved;
 GUID dbcc_classguid;
 char dbcc_name[1];
} DEV_BROADCAST_DEVICEINTERFACE_A, *PDEV_BROADCAST_DEVICEINTERFACE_A;
typedef struct _DEV_BROADCAST_DEVICEINTERFACE_W {
 DWORD dbcc_size;
 DWORD dbcc_devicetype;
 DWORD dbcc_reserved;
 GUID dbcc_classguid;
 wchar_t dbcc_name[1];
} DEV_BROADCAST_DEVICEINTERFACE_W, *PDEV_BROADCAST_DEVICEINTERFACE_W;
 
#ifdef UNICODE
typedef DEV_BROADCAST_DEVICEINTERFACE_W DEV_BROADCAST_DEVICEINTERFACE;
typedef PDEV_BROADCAST_DEVICEINTERFACE_W PDEV_BROADCAST_DEVICEINTERFACE;
#else
typedef DEV_BROADCAST_DEVICEINTERFACE_A DEV_BROADCAST_DEVICEINTERFACE;
typedef PDEV_BROADCAST_DEVICEINTERFACE_A PDEV_BROADCAST_DEVICEINTERFACE;
#endif
 
typedef struct _DEV_BROADCAST_HANDLE {
 DWORD dbch_size;
 DWORD dbch_devicetype;
 DWORD dbch_reserved;
 HANDLE dbch_handle;
 DWORD dbch_hdevnotify;
 GUID dbch_eventguid;
 LONG dbch_nameoffset;
 BYTE dbch_data[1];
} DEV_BROADCAST_HANDLE, *PDEV_BROADCAST_HANDLE;
#endif /* (_WIN32_WINDOWS >= 0x0410 || _WIN32_WINNT >= 0x0500) */
 
#ifdef __cplusplus
}
#endif
#endif


Добавлено через 1 час 57 минут
Решил проблему с 4 пунктом. Оказался лишним знак амперсанда:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    if(iMsg == WM_DEVICECHANGE)
    {
        if (wParam == DBT_DEVICEARRIVAL)
        {
            cout << "Connected by USB\n";
 
            PDEV_BROADCAST_HDR data = (PDEV_BROADCAST_HDR)lParam;
 
            if (data->dbch_devicetype == DBT_DEVTYP_VOLUME)
            {
                cout << "Flash card defined.\n";
 
                PDEV_BROADCAST_VOLUME volume = (PDEV_BROADCAST_VOLUME)data;
                cout << volume->dbcv_unitmask << '\n';
            }
 
        }
    if (wParam == DBT_DEVICEREMOVECOMPLETE)
        {cout << "--------------------\n"; cout << "Removed by USB\n"; cout << "--------------------\n"; }
        return 0;
    }
 
    return DefWindowProc(hwnd, iMsg, wParam, lParam);
}


Но теперь проблема с PDEV_BROADCAST_VOLUME, а конкретно с dbcv_unitmask, выдает 128 вместо 7
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2014, 13:49
Ответы с готовыми решениями:

Отслеживание подключения по usb порту
Подскажите пример кода как отслеживать подключение по usb порту. И дайте по возможности где об...

Отслеживание подключения флешки по USB
Такой вопрос: чем увидеть подключаемую к компу флешку USB, где в реестре об этом хранится...

Отслеживание подключения флешки через VBS-скрипт
Блин, ну, хоть убейте, но ничего не выходит. В общем вот мой 1й батник: @echo off ren *.arm *.jpg...

Отслеживание подключения к Wi-Fi
Добрый день, подскажите как можно отследить есть подключение к Wi-Fi или оно пропало?

Отслеживание подключения USB устройств
Требуется написать консольное приложение (в дальнейшем службу) отслеживать любое подключение USB...

2
castaway
Эксперт С++
4941 / 3047 / 455
Регистрация: 10.11.2010
Сообщений: 11,144
Записей в блоге: 10
Завершенные тесты: 1
06.03.2014, 14:24 2
1. Да.
2. Убери всё не нужное: курсор, иконку и т.п.
3. Зачем тебе константа DBT_DEVTYP_DEVICEINTERFACE если в программе ты её нигде не используешь? Если уж решил явно объявить версию ОС (#define _WIN32_WINNT 0x0500), то делай это до включения всех заголовочных файлов (хотя это всё равно не поможет).
4. В моём случае поле dbch_devicetype содержит DBT_DEVTYP_VOLUME ("красивое" значение 0x00000002)

Обрабатывать надо так, как говорит официальная документация:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    case WM_DEVICECHANGE: {
        PDEV_BROADCAST_HDR p_dbh = (PDEV_BROADCAST_HDR)lParam;
        if ( wParam == DBT_DEVICEARRIVAL ) {
            if ( p_dbh->dbch_devicetype == DBT_DEVTYP_VOLUME ) {
                PDEV_BROADCAST_VOLUME p_dbv = (PDEV_BROADCAST_VOLUME)p_dbh;
 
                // Не знаю почему, но на моей Windows 7 поле dbcv_flags == 0. В данном случае оно игнорируется..
                //if ( p_dbv->dbcv_flags & DBTF_MEDIA ) {
                    //printf( " (DBTF_MEDIA)" );
 
                    // get first drive letter
                    unsigned i, mask = p_dbv->dbcv_unitmask;
                    for ( i = 0; i < 26; ++i ) {
                        if ( mask & 1 ) break;
                        mask = mask >> 1;
                    }
                    printf( "Drive '%c' has been mounted\n", i + 'a' );
                //}
            }
        }
    } break;
1
Pjeroo
Землянин
34 / 34 / 16
Регистрация: 15.01.2013
Сообщений: 313
06.03.2014, 14:31  [ТС] 3
castaway, спасибо
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2014, 14:31

Отслеживание события поднятия трубки
Здравствуйте. Появилась пролема при дозвоне через голосовой модем. Дело в том, что некоторые модемы...

Отслеживание события нажатия кнопки на форме
Пишу программу - тестер для студентов (заодно выслушаю критику по коду) Есть xml-файлик с...

Отслеживание одного события из разных классов
Можно ли в C# отслеживать одно и то же событие из разных классов? Т.е. скажем в классе Form1 у меня...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru