Отследить подключение USB-накопителя
Например, чтобы при подключении флешки появлялось сообщение "Подключено".
Спасибо!
Адапитровать не получается, помоги примером?
Пробую писать:
__in HANDLE hRecipient,
__in LPVOID NotificationFilter,
__in DWORD Flags
);
Адапитровать не получается, помоги примером?
Пробую писать:
__in HANDLE hRecipient,
__in LPVOID NotificationFilter,
__in DWORD Flags
);
Тогда вы не умеете вызывать АПИ. Какие ошибки Вы получаете? Да и вряд-ли в поставке билдера не будет готовых заголовочных файлов...
Блин всё это так долго, мне нужно очень срочно((
Неужели нет готового решения?
Вот мой код:
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#include <windows.h>
#include <IniFiles.hpp>
#include <fstream.h>
#include <jpeg.hpp>
#include <vcl.h>
#include "Unit1.h"
#include <vector>
#include <string>
using namespace std;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HDEVNOTIFY WINAPI RegisterDeviceNotification(
__in HANDLE hRecipient,
__in LPVOID NotificationFilter,
__in DWORD Flags
);
...
[C++ Error] winuser.h(3229): E2344 Earlier declaration of '__stdcall RegisterDeviceNotificationA(void *,void *,unsigned long)'
[C++ Error] Unit1.cpp(46): E2063 Illegal initialization
Я реализовал такое уже на Visual C#, в IDE MS Visual C# 2010. И всё работало, вот код:
public struct DEV_BROADCAST_VOLUME
{
public int dbcv_size;
public int dbcv_devicetype;
public int dbcv_reserved;
public int dbcv_unitmask;
}
const int WM_DEVICECHANGE = 0x0219;
const int DBT_DEVICEARRIVAL = 0x8000;
const int DBT_DEVTYP_VOLUME = 0x00000002;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_DEVICECHANGE && m.WParam.ToInt32() == DBT_DEVICEARRIVAL)
{
int devType = Marshal.ReadInt32(m.LParam, 4);
if (devType == DBT_DEVTYP_VOLUME)
{
DEV_BROADCAST_VOLUME disk;
disk = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME));
string drives = "";
for (int i = 0; disk.dbcv_unitmask != 0; i++)
{
if ((disk.dbcv_unitmask & 1) == 1) { drives += char.ToString((char)(i + 65)) + ": "; }
disk.dbcv_unitmask = disk.dbcv_unitmask >> 1;
}
MessageBox.Show("флешка подключена, буква - " + drives);
}
}
if (m.Msg == WM_DEVICECHANGE && m.WParam.ToString() == "32772")
{
MessageBox.Show("флешка отключена");
}
base.WndProc(ref m);
}
: TForm(Owner)
{
HDEVNOTIFY WINAPI RegisterDeviceNotification(
HANDLE hRecipient,
LPVOID NotificationFilter,
DWORD Flags
);
//
//остальной код
//
}
Я так понимаю нужно копать в сторону WM_DEVICECHANGE, нашёл такие статьи по теме: раз, два, три, но только как из этого сложить то что мне надо знаний не хватает... Помогите?
Неправильно,этим кодом Вы ещё ничего не сделали,а описали прототип функции в функции…эээ,BCB не знаю,но в чём-то,имеющем отношение к главной форме
Надо вызвать эту функцию с нужными параметрами(для этого надо прочесть MSDN),а затем в функции окна ловить означенное событие.Лень читать MSDN,но из названий параметров полагаю,что hRecipient—дескриптор окна,NotificationFilter—что ловить будем,Flags—какие-то флаги,наверняка можно в 0 обратить
За всем остальным—по любой из предоставленных ссылок(ну или лучше по всем)
__in HANDLE hRecipient,
__in LPVOID NotificationFilter,
__in DWORD Flags
);
Насчёт флагов наверняка есть ссылочка в описании функции где они все отдельно описаны. Первый параметр не лазя в мсдн понятно что это хендл(дескриптор) , и переведя описание первого параметра наверняка можно понять о чём реч.
Вы в мсдн были? Я был, всё описано.
1 - й параметр хендл окна или службы которое получит событие устройства указанное во втором параметре. Можно использовать этот хендл вызывая эту функцию несколько раз
2 -й параметр указатель на структуру которую вы должны заполнить перед вызовом. Открываете описание структуры в мсдн и заполняете, скорее всего не все поля обязательны к заполнению.
И не забываем вызвать UnregisterDeviceNotification, даже не открывал описание но скорее всего она будет требовать один единственный параметр, хендл который вам даст RegisterDeviceNotification.
Form1->Handle,
DBT_DEVTYP_VOLUME,
DEVICE_NOTIFY_WINDOW_HANDLE
);
Что делать?
Особенно если учитывать что это есть в Windows.h
И куда вы собрались хендл принимать, в WINAPI ??? Там тогда равно пропущено
И куда вы собрались хендл принимать, в WINAPI ???
А как тогда.. До меня что то не доходит, покажите на примере пожалуйста. Просто срочно надо((
DEV_BROADCAST_HDR dbh;
Потом вы её заполняете:
dbh->... = значение;
dbh->... = значение;
dbh->... = значение;
И лиш потом вызываете функцию, примерно так:
hdevnotify = RegisterDeviceNotification(Form1->Handle, &dbh, DEVICE_NOTIFY_WINDOW_HANDLE);
Вы бродите по мсдн пока все поля всех структур не станут простыми типами.
Я реализовал такое уже на Visual C#, в IDE MS Visual C# 2010. ...
Вы уверенны что именно вы это реализовали? Судя по задаваемым вопросам это не возможно!!!
Form1->Handle,
DBT_DEVTYP_VOLUME,
DEVICE_NOTIFY_WINDOW_HANDLE
);
Что делать?
DBT_DEVTYP_VOLUME передаёте. Вам же пишут в описании что это "Pointer".
Либо так &DBT_DEVTYP_VOLUME, либо так PDBT_DEVTYP_VOLUME.
Это я про передачу параметра. А каким этот параметр должен быть вам мсдн подскажет
Да, это действительно так. Лично один раз столкнулся в эмбаркадеровском делфи. Судя из описания в мсдн функция должна быть в библиотеке User32.dll и быть описана в модуле Windows. Никак не мог воспользоваться пока не загрузил библиотеку.
Функция действительно оказалась на месте, мсдн не обманул.