Малко помощ

5 отговора 0 прегледа
#1

Малко помощ

Здравейте,

Бих искал да помоля за малко помощ.

бихте ли ме насочили как да разбера когато USB drive се plug/unplug-ва
в компа.


Благодаря

Отговор
в отговор на ozzoz #2

Я пробвай това дали работи


unit Unit1;

interface

uses
Windows, Messages, Classes, Forms, StdCtrls, Controls;

type
TForm1 = class(TForm)
Label1: TLabel;
private
{ Private declarations }
protected
procedure WMDEVICECHANGE(var Msg: TMessage); message WM_DEVICECHANGE;
public
{ Public declarations }
end;

// Device constants
const
DBT_DEVICEARRIVAL = $00008000;
DBT_DEVICEREMOVECOMPLETE = $00008004;
DBT_DEVTYP_VOLUME = $00000002;

// Device structs
type
_DEV_BROADCAST_HDR = packed record
dbch_size: DWORD;
dbch_devicetype: DWORD;
dbch_reserved: DWORD;
end;
DEV_BROADCAST_HDR = _DEV_BROADCAST_HDR;
TDevBroadcastHeader = DEV_BROADCAST_HDR;
PDevBroadcastHeader = ^TDevBroadcastHeader;

type
_DEV_BROADCAST_VOLUME = packed record
dbch_size: DWORD;
dbch_devicetype: DWORD;
dbch_reserved: DWORD;
dbcv_unitmask: DWORD;
dbcv_flags: WORD;
end;
DEV_BROADCAST_VOLUME = _DEV_BROADCAST_VOLUME;
TDevBroadcastVolume = DEV_BROADCAST_VOLUME;
PDevBroadcastVolume = ^TDevBroadcastVolume;

var
Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.WMDEVICECHANGE(var Msg: TMessage);
var lpdbhHeader: PDevBroadcastHeader;
lpdbvData: PDevBroadcastVolume;
dwIndex: Integer;
lpszDrive: String;
begin

// Perform inherited
inherited;

// Get the device notification header
lpdbhHeader:=PDevBroadcastHeader(Msg.lParam);

// Handle the message
lpszDrive:='Drive ';
case Msg.WParam of
DBT_DEVICEARRIVAL :
begin
if (lpdbhHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
begin
lpdbvData:=PDevBroadcastVolume(Msg.lParam);
for dwIndex:=0 to 25 do
begin
if ((lpdbvData^.dbcv_unitmask shr dwIndex) = 1) then
begin
lpszDrive:=lpszDrive+Chr(65+dwIndex);
break;
end;
end;
Label1.Caption:=lpszDrive+' available';
end;
end;
DBT_DEVICEREMOVECOMPLETE:
begin
if (lpdbhHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
begin
lpdbvData:=PDevBroadcastVolume(Msg.lParam);
for dwIndex:=0 to 25 do
begin
if ((lpdbvData^.dbcv_unitmask shr dwIndex) = 1) then
begin
lpszDrive:=lpszDrive+Chr(65+dwIndex);
break;
end;
end;
Label1.Caption:=lpszDrive+' removed';
end;
end;
end;
end;

end.


Linux isn't free, it's worthless.


Отговор
в отговор на andrew_nikoloff #3

Re: Я пробвай това дали работи

Перфектно е

Благодаря много.

Отговор
в отговор на andrew_nikoloff #4

Re: Я пробвай това дали работи

Незнам защо но при мен не тръгва.

Отговор
в отговор на Timo #5

Re: Я пробвай това дали работи

Какво означава "не тръгва"? Натискаш F9, показва се диалога за компилиране и си седи така?
Получаваш ли WM_DEVICECHANGE съобщения? С каква версия на Delphi си? С каква версия на Windows си? По принцип показват ли се на Windows-а прозорците за избор на действие, когато си включиш флашката? Да не го пробваш на виртуална машина? Да не си пускал някой тул за "оптимизиране" на Windows-а? Променял ли си кода на примера? Нещо друго?...

Linux isn't free, it's worthless.


Отговор
в отговор на andrew_nikoloff #6

Re: Я пробвай това дали работи

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Label1: TLabel;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
//
end;

procedure TForm1.WMDeviceChange(var Msg: TMessage);
const
DBT_DEVICEARRIVAL = $8000; // system detected a new device
DBT_DEVICEREMOVECOMPLETE = $8004; // device is gone
var
myMsg: string;
begin
inherited;
case Msg.wParam of
DBT_DEVICEARRIVAL: myMsg := 'vklu4eno!';
DBT_DEVICEREMOVECOMPLETE: myMsg := 'izklu4eno!';
end;
Label1.Caption:= myMsg;
end;


end.

Това работи

естествнно че съм бъркъл навсякъде

Редактирано от Timo на

Отговор