Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Как отловить событие вставки USB


Автор: andrew_121 14.1.2009, 12:27
Здравствуйте.
Вопрос в следующем: Нужно чтоб при втыкании флешки программа получа сигнал. Или же сканировать USB порты, и определять - появилось ли что-то новое.
Как это сделать?

Автор: THandle 14.1.2009, 14:26
andrew_121, лови http://msdn.microsoft.com/en-us/library/aa363480(VS.85).aspx с wParam = http://msdn.microsoft.com/en-us/library/aa363205(VS.85).aspx.

Автор: andrew_121 14.1.2009, 17:02
THandle, Спасибо!
Проблема только в том, что программа написана на Qt, и как запустить цикл обработки событий, я не в курсе. 
Щас скину вопрос об этом в другой раздел.

Автор: Earnest 14.1.2009, 17:48
Цитата(andrew_121 @  14.1.2009,  18:02 Найти цитируемый пост)
как запустить цикл обработки событий, я не в курсе. 

Тебе не надо запускать цикл обработки, тебе нужно добавить обработчик конкретного события.

Автор: andrew_121 14.1.2009, 17:56
Earnest, Прошу прощения за неправильность формулировки. Я думаю Вы поняли о чем речь.
Так как в Qt глобально перехватывать сообщения?

Автор: Earnest 14.1.2009, 19:19
Нет, действительно, не поняла. Лучше спросить в соответствующем разделе.

Автор: jonie 15.1.2009, 01:15
есть подозрения что получится с куте через очень хитрозакрученную жопу. не вижу никаких проблем сделать динамическую библиотеку (для винды чисто), чтобы она сама создавала себе скрытое окно (а в NT5+ есть спец типы окон для этих целей) и уведомляла qt прогу посредством сигналов о вставке (или как там делается "по уму")...

Автор: andrew_121 15.1.2009, 10:34
jonie, Спасибо!!!
Вопрос уже решен: http://www.prog.org.ru/index.php?topic=8363.msg45556#msg45556
Всем огромное СПАСИБО!!!

Автор: ProgramerKo 20.1.2009, 01:36
Earnest, можешь пример дать? (для VS или BCB)

Автор: Dem_max 20.1.2009, 05:11
ProgramerKo, 
тебе под Qt или обычную WinAPI программу или VCL ? 

Автор: ProgramerKo 21.1.2009, 00:54
обычную ВинАпи програмку smile 

Автор: Dem_max 21.1.2009, 20:46
Код

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
   void __fastcall FormCreate(TObject *Sender);
private:    // User declarations
        void __fastcall WMDeviceChange(TMessage& Msg);
        BEGIN_MESSAGE_MAP
        VCL_MESSAGE_HANDLER(WM_DEVICECHANGE, TMessage, WMDeviceChange)
        END_MESSAGE_MAP(TForm)
public:        // User declarations
   __fastcall TForm1(TComponent* Owner);
   bool __fastcall RegisterDeviceInterfaceToHwnd(GUID InterfaceClassGuid, HWND hWnd, HDEVNOTIFY *hDeviceNotify);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

и
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <Dbt.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
GUID WceusbshGUID = {0x25dbce51,0x6c8f,0x4a72,0x8a,0x6d,0xb5,0x4c,0x2b,0x4f,0xc8,0x35}; // для PnP
HDEVNOTIFY hDeviceNotify;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WMDeviceChange(TMessage &Msg)
{
  if(Msg.WParam == DBT_DEVICEARRIVAL) ShowMessage("Воткнули");
  if(Msg.WParam == DBT_DEVICEREMOVECOMPLETE) ShowMessage("Выткнули");

}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 RegisterDeviceInterfaceToHwnd(WceusbshGUID, Form1->Handle, &hDeviceNotify);
}
//---------------------------------------------------------------------------
bool __fastcall TForm1::RegisterDeviceInterfaceToHwnd(GUID InterfaceClassGuid, HWND hWnd, HDEVNOTIFY *hDeviceNotify)
{
   DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;

   ZeroMemory(&NotificationFilter, sizeof(NotificationFilter) );
   NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
   NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
   NotificationFilter.dbcc_classguid = InterfaceClassGuid;

   *hDeviceNotify = RegisterDeviceNotification(hWnd, &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);

   if(NULL == *hDeviceNotify) return FALSE;

   return TRUE;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)