Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/20: Рейтинг темы: голосов - 20, средняя оценка - 4.55
Fitz
7 / 7 / 0
Регистрация: 09.10.2011
Сообщений: 38
1

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

15.12.2011, 23:42. Просмотров 4176. Ответов 14
Метки нет (Все метки)

Такой вопрос: чем увидеть подключаемую к компу флешку USB, где в реестре об этом хранится информация и как програмно запустить с этой флешки файл?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2011, 23:42
Ответы с готовыми решениями:

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

Серийный номер USB флешки
Доброе время суток помогите исходничком, необходимо при нажатии на кнопку в эдите выдовало...

Получение ID отключаемой usb флешки
BOOL RemoveUSBDevice(int index) //{f1ce5fad-7724-11e1-8fef-005056c00008} - GUID флешки моей {...

Информация о производителе (изготовителе, модели) usb флешки
подскажите пожалуйста кто знает как вытащить информацию о производителе (изготовителе, модели) usb...

Отслеживание события подключения флешки
Есть несколько вопросов: 1. Для отслеживания происходящего в Windows (в данном случае...

14
StudAssistant
Эксперт
34811 / 27003 / 5019
Регистрация: 17.04.2006
Сообщений: 49,622
15.12.2011, 23:42
Закажите контрольную, курсовую, диплом или любую другую студенческую работу здесь.
14
kzru_hunter
1067 / 782 / 100
Регистрация: 01.02.2011
Сообщений: 1,795
Записей в блоге: 1
16.12.2011, 17:15 2
Цитата Сообщение от Fitz Посмотреть сообщение
Отслеживание USB
По таймеру или по сообщению WM_DEVICECHANGE опрашивать диски с помощью функции GetLogicalDrives, функцией GetDriveType проверять тип (если DRIVE_REMOVABLE -> флешка).
при опрашивании соответственно сравнивать текущий список диск с теми, что были сохранены в памяти при прошлом опросе, для того, чтобы выявить добавленные или удаленные.

Цитата Сообщение от Fitz Посмотреть сообщение
как програмно запустить с этой флешки файл?
через функцию WinExec
3
Fitz
7 / 7 / 0
Регистрация: 09.10.2011
Сообщений: 38
17.12.2011, 10:19  [ТС] 3
хотелось бы онлайн. т.е. программа запущена и следит за подключением. а примеров нету каких нибудь?


з.ы. спасибо!

Добавлено через 12 часов 0 минут
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#include "DBT.h"
TForm1 *Form1;
//---------------------------------------------------------------------------
 
 
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
 
void __fastcall TForm1::DeviceScanClick(tagMSG &Msg,
      bool &Handled)
{
  if(Msg.message == WM_DEVICECHANGE)
    {
        switch (Msg.wParam)
        {
            case DBT_DEVICEARRIVAL:
            ShowMessage("Begin");
            break ;
 
            case DBT_DEVNODES_CHANGED:
            ShowMessage( "End");
        }
    }
 
    if (Msg.message == WM_DEVICECHANGE)
    {
        //Memo1->Lines->Add("WM_DEVICECHANGE__wParam = "+String(Msg.wParam));
        lstDeviceList->Items->Add("WM_DEVICECHANGE__wParam = "+String(Msg.wParam));
        Handled = true;
    }
}
//---------------------------------------------------------------------------

вот кусок кода, подскажите, как чайнику =( что нужно добавить(изменить) что бы отследить флешку?)
1
kzru_hunter
1067 / 782 / 100
Регистрация: 01.02.2011
Сообщений: 1,795
Записей в блоге: 1
19.12.2011, 10:11 4
Лучший ответ Сообщение было отмечено как решение

Решение

Вот пример, не полностью рабочий. Остальное надеюсь доделаешь.
4
Вложения
Тип файла: rar Диски.rar (12.8 Кб, 200 просмотров)
19.12.2011, 10:11
Fitz
7 / 7 / 0
Регистрация: 09.10.2011
Сообщений: 38
21.12.2011, 15:45  [ТС] 5
а если в момент загрузки прогдаммы юсб устройства уже подключены? Как их определить?
0
Samrisbe
1354 / 724 / 66
Регистрация: 28.01.2011
Сообщений: 2,010
27.12.2011, 00:06 6
Цитата Сообщение от kzru_hunter Посмотреть сообщение
По таймеру или по сообщению WM_DEVICECHANGE опрашивать диски с помощью функции GetLogicalDrives, функцией GetDriveType проверять тип (если DRIVE_REMOVABLE -> флешка).
Помоему это ответ на ваш вопрос...
0
Fitz
7 / 7 / 0
Регистрация: 09.10.2011
Сообщений: 38
27.12.2011, 21:44  [ТС] 7
я так понимаю это - если устройство подключается во время работы программы. а вот чтобы программа отловила уже подключенные?
0
kzru_hunter
1067 / 782 / 100
Регистрация: 01.02.2011
Сообщений: 1,795
Записей в блоге: 1
27.12.2011, 23:01 8
Цитата Сообщение от Fitz Посмотреть сообщение
а вот чтобы программа отловила уже подключенные?
все устройства можно получить с помощью функции GetLogicalDrives или GetLogicalDriveStrings.
каждое из них нужно будет проверить с помощью функции GetDriveType (если это флешка, то возвратит DRIVE_REMOVABLE)
2
nick42
Практикантроп
4452 / 2418 / 438
Регистрация: 23.09.2011
Сообщений: 5,184
28.12.2011, 18:56 9
- странно: GetLogicalDrives у меня нормально работает, а GetLogicalDriveStrings вылетает с ошибкой уже в программе <Access Violation>. Это у меня только?
0
Fitz
7 / 7 / 0
Регистрация: 09.10.2011
Сообщений: 38
12.01.2012, 21:48  [ТС] 10
Вот часть функции. в идеале должна видеть уже подключенные USB и вновь подключаемые и в массив их записывать, создавая список подключенных флешек. но что то немного крива работает... мысли есть? (в memo2 выводит неправильно уже подключенные флешки)

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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include <dbt.h>
#include "windows.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
String DrList[6], S;
int i=0, j;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 
    Memo1-> Clear();
    Memo2-> Clear();
 
//---------------------------------------------------------------------------
 
//static DWORD old_drives1 = GetLogicalDrives();
static DWORD old_drivesOn = 61;                                                       //мой компьютер
int new_drivesOn = GetLogicalDrives();
 
int driveOn = 0, count = 0;
String sDriveOn = "A:";
 
 
if (new_drivesOn > 61)
    {
        driveOn = new_drivesOn-old_drivesOn;
        int driveOnNew = driveOn;
        int index = 61;
 
        if (new_drivesOn > 128)
        {
            index = 62;
        }
 
        for (driveOnNew; driveOnNew < new_drivesOn; driveOnNew+index)
        {
 
            while (driveOn)
            {
                driveOn >>= 1; count++;
            }
            sDriveOn[1] += count - 1;
 
            if (GetDriveType(sDriveOn.c_str()) != DRIVE_REMOVABLE);
            {
                Memo1->Lines->Add("Уже подключено USB устройство " + sDriveOn);
            }
 
            driveOnNew = driveOnNew +index;
 
        }
 
//---
 
    DrList[i] = sDriveOn;
    for (int i=0; i<6; i++)
    if (DrList[i] != 0)
    {
        S  += DrList[i]+" ";
        Memo2->Text = S;
    }
 
    Memo2->Text = S;
 
//---
           //old_drivesOn = new_drivesOn;
           //   new_drivesOn = old_drivesOn + old_drivesOn;
 
    }
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::FWM_DEVICECHANGE(TMessage &Message)
{
    static DWORD old_drives = GetLogicalDrives();
 
    int new_drives = GetLogicalDrives();
    int drive = 0, count = 0;
    String sDrive = "A:";
 
    if (Message.WParam == DBT_DEVICEARRIVAL)
    {
        // определяем букву
        drive = new_drives-old_drives;
        while (drive)
        {
            drive >>= 1; count ++;
        }
        sDrive[1] += count - 1;
 
        // тип устройства
        if (GetDriveType(sDrive.c_str()) != DRIVE_REMOVABLE) return;
 
        // выводим
        Memo1->Lines->Add("Подключено USB устройство " + sDrive);
 
        // запоминаем
        old_drives = new_drives;
 
        //создаем список подключенных устройств
 
        i = i + 1;
 
        if (i == 6)
        {
            i = 0;
        }
 
        DrList[i] = sDrive;
        for (int i=0; i<6; i++)
        if (DrList[i] != 0)
        {
            S  += DrList[i]+" ";
            Memo2->Text = S;
        }
 
        Memo2->Text = S;
 
    }
/*      else
        if (Message.WParam == DBT_DEVICEREMOVECOMPLETE)
        {
                // определяем букву
                drive = old_drives-new_drives;
                while (drive)
                {
                    drive >>= 1; count++;
                }
                sDrive[1] += count-1;
 
                Memo1->Lines->Add("Удалено USB устройство " + sDrive);
 
 
                //обновляем список подключенных устройств
                Memo2->Clear();
 
                for (j = 0; j < 6; j++)
                {
                //DrList[j].Compare(sDrive);
 
 
 
                    if (DrList[j][1] == sDrive[1])
                    {
                        DrList[j] = NULL;
                        break;
                    }
 
                    Memo2->Text = DrList[j];
 
                // запоминаем
                old_drives = new_drives;
                }
 
        }         */
 
//---------------------------------------------------------------------------
 
    else
    if (Message.WParam == DBT_DEVICEREMOVECOMPLETE)
    {
        // определяем букву
        drive = old_drives-new_drives;
        while (drive)
        {
            drive >>= 1; count++;
        }
 
 
        sDrive[1] += count-1;
        // тип устройства
        //int type = GetDriveType(sDrive.c_str());
 
        //if (GetDriveType(sDrive.c_str()) != DRIVE_REMOVABLE) return;
 
        // выводим
        //Memo1->Lines->Add(type);
        Memo1->Lines->Add("Удалено USB устройство: " + sDrive);
 
        //обновляем список подключенных устройств
        Memo2->Clear();
 
        // запоминаем
 
 /*      for (j = 1; j < 6; j++)
                {
                //DrList[j].Compare(sDrive);
 
 
 
                    if (DrList[j][1] == sDrive[1])
                    {
                        DrList[j] = NULL;
                        break;
                    }
 
 
 
 
        old_drives = new_drives;
    }
 
}
                */
}
 
    }
 
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Close();
}
//---------------------------------------------------------------------------
1
TheDarkMax2
16 / 16 / 3
Регистрация: 23.09.2011
Сообщений: 186
08.02.2012, 16:03 11
Цитата Сообщение от kzru_hunter Посмотреть сообщение
По таймеру или по сообщению WM_DEVICECHANGE опрашивать диски с помощью функции GetLogicalDrives, функцией GetDriveType проверять тип (если DRIVE_REMOVABLE -> флешка).
при опрашивании соответственно сравнивать текущий список диск с теми, что были сохранены в памяти при прошлом опросе, для того, чтобы выявить добавленные или удаленные.


через функцию WinExec
Можно ли добиться получения более подробной информации от системы? Я имею в виду, что-то окромя DBT_DEVNODES_CHANGED? Просто мне необходимо отслеживать присоединение и отсоединение одного устройства, и это очень бы помогло.
0
raxp
10192 / 6575 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
08.02.2012, 17:42 12
...нате, думаю без труда переведете на свой синтаксис:
Delphi
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
//------------------------------------------
// Flash USB
// Модуль определения буквы и подключения USB
// Author: Бадло Сергей Григорьевич
// H-page: [url]http://raxp.radioliga.com[/url]
// Cистемные требования: win32
//------------------------------------------
 
program flash;
 
uses Messages,Classes, Windows;
 
 
type
 
 PDevBroadcastHdr = ^TDevBroadcastHdr;
 TDevBroadcastHdr = packed record
 dbcd_size: DWORD;
 dbcd_devicetype: DWORD;
 dbcd_reserved: DWORD;
end;
 
 PDevBroadcastVolume = ^TDevBroadcastVolume;
 TDevBroadcastVolume = packed record
 dbcv_size: DWORD;
 dbcv_devicetype: DWORD;
 dbcv_reserved: DWORD;
 dbcv_unitmask: DWORD;
 dbcv_flags: Word;
end;
 
 TF = class
 protected
  FWnd: HWnd;
  constructor Create;
  destructor Destroy;
  procedure WndProcc(var Msg:TMessage); message WM_DeviceChange;
end;
 
 
const
DBT_DeviceArrival = $8000;
DBT_DeviceRemoveComplete = $8004;
DBTF_Media = $0001;
DBT_DevTyp_Volume = $0002;
 
var
  FWnd: HWnd;
  t: tf;
  Msg: tmsg;
 
// СКЕЛЕТ =====================================================================
function GetDrive(pDBVol: PDevBroadcastVolume): string;
var i: Byte;
    Maske: DWORD;
begin
 Maske := pDBVol^.dbcv_unitmask;
 for i := 0 to 25 do begin
  if (Maske and 1) = 1 then
   Result := Char(i + Ord('A')) + ':';
  Maske := Maske shr 1;
 end
end;
 
constructor TF.Create;
begin
 inherited Create;
 FWnd:= AllocateHWnd(WndProcc);
end;
destructor TF.Destroy;
begin
 inherited Create;
 deAllocateHWnd(fWnd)
end;
 
procedure tf.WndProcc(var Msg:TMessage);
begin
 if Msg.wparam = DBT_DEVICEARRIVAL then
  if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DevTyp_Volume then
   messagebox(fwnd,pchar(GetDrive(PDevBroadcastVolume(Msg. lParam))),'',0)
end;
 
 
 
 
begin
 t:= tf.Create;
 
 try while GetMessage(Msg, 0, 0, 0) do begin
  TranslateMessage(Msg);
  DispatchMessage(Msg)
 end finally t.destroy end
// END СКЕЛЕТ =================================================================
 
end.
0
Вложения
Тип файла: zip flash.ZIP (49.3 Кб, 60 просмотров)
TheDarkMax2
16 / 16 / 3
Регистрация: 23.09.2011
Сообщений: 186
08.02.2012, 17:48 13
Цитата Сообщение от TheDarkMax2 Посмотреть сообщение
Можно ли добиться получения более подробной информации от системы? Я имею в виду, что-то окромя DBT_DEVNODES_CHANGED? Просто мне необходимо отслеживать присоединение и отсоединение одного устройства, и это очень бы помогло.
Я имел в виду, что мне всегда приходит только DBT_DEVNODES_CHANGED.
0
Dondok
18 / 34 / 2
Регистрация: 28.01.2012
Сообщений: 181
14.02.2012, 22:21 14
Цитата Сообщение от kzru_hunter Посмотреть сообщение
Вот пример, не полностью рабочий. Остальное надеюсь доделаешь.
Вложения
Диски.rar (12.8 Кб, 21 просмотров)
а где мне найти компонент к этой программе? у меня С++ Builder 2006 и при компиляции требует "MYCOMPONENTS.BPI"
0
Cha1000000
5 / 4 / 3
Регистрация: 04.06.2015
Сообщений: 243
Записей в блоге: 1
08.04.2016, 12:21 15
Доброго всем времени суток, коллеги! Кто бы мог подсказать, а как на билдере кооректно записать вот такой участок, приведенной выше программы:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure tf.WndProcc(var Msg:TMessage);
begin
 if Msg.wparam = DBT_DEVICEARRIVAL then
  if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DevTyp_Volume then
   messagebox(fwnd,pchar(GetDrive(PDevBroadcastVolume(Msg. lParam))),'',0)
end;
 
 
 
 
begin
 t:= tf.Create;
 
 try while GetMessage(Msg, 0, 0, 0) do begin
  TranslateMessage(Msg);
  DispatchMessage(Msg)
 end finally t.destroy end
Или как правильно вообще в билдере будет вызвать и переопределить родную WndProc ??
0
08.04.2016, 12:21
StackOverflow
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2016, 12:21

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

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

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


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

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

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