2024年5月30日发(作者:)

DELPHI编程捕获U盘插入或者拔出

翻了下老帖子,月亮写的,根据LS发的MSDN翻译的

源地址:

/u/20090628/16/

Delphi(Pascal)code

functionOpenVolume(ADrive:char):THandle;

var

RootName,VolumeName:string;

AccessFlags:DWORD;

begin

RootName:=ADrive+':'+#134;//ADrive+':'killsthesyntaxhighlighting

caseGetDriveType(PChar(RootName))of

DRIVE_REMOVABLE:

AccessFlags:=GENERIC_READorGENERIC_WRITE;

DRIVE_CDROM:

AccessFlags:=GENERIC_READ;

else

Result:=INVALID_HANDLE_VALUE;

exit;

end;

VolumeName:=Format('.%s:',[ADrive]);

Result:=CreateFile(PChar(VolumeName),AccessFlags,

FILE_SHARE_READorFILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0);

ifResult=INVALID_HANDLE_VALUEthen

RaiseLastWin32Error;

end;

functionLockVolume(AVolumeHandle:THandle):boolean;

const

LOCK_TIMEOUT=10*1000;//10Seconds

LOCK_RETRIES=20;

LOCK_SLEEP=LOCK_TIMEOUTdivLOCK_RETRIES;

//#defineFSCTL_LOCK_VOLUMECTL_CODE(FILE_DEVICE_FILE_SYSTEM,

METHOD_BUFFERED,FILE_ANY_ACCESS)

FSCTL_LOCK_VOLUME=(9shl16)or(0shl14)or(6shl2)or0;

var

Retries:integer;

BytesReturned:Cardinal;

begin

forRetries:=1toLOCK_RETRIESdobegin

6,

Result:=DeviceIoControl(AVolumeHandle,FSCTL_LOCK_VOLUME,nil,0,

nil,0,BytesReturned,nil);

ifResultthen

break;

Sleep(LOCK_SLEEP);

end;

end;

functionDismountVolume(AVolumeHandle:THandle):boolean;

const

//#defineFSCTL_DISMOUNT_VOLUMECTL_CODE(FILE_DEVICE_FILE_SYSTEM,8,

METHOD_BUFFERED,FILE_ANY_ACCESS)

FSCTL_DISMOUNT_VOLUME=(9shl16)or(0shl14)or(8shl2)or0;

var

BytesReturned:Cardinal;

begin

Result:=DeviceIoControl(AVolumeHandle,FSCTL_DISMOUNT_VOLUME,nil,0,

nil,0,BytesReturned,nil);

ifnotResultthen

RaiseLastWin32Error;

end;

functionPreventRemovalOfVolume(AVolumeHandle:THandle;

APreventRemoval:boolean):boolean;

const

//#defineIOCTL_STORAGE_MEDIA_REMOVALCTL_CODE(IOCTL_STORAGE_BASE,

0x0201,METHOD_BUFFERED,FILE_READ_ACCESS)

IOCTL_STORAGE_MEDIA_REMOVAL=($2dshl16)or(1shl14)or($201shl2)or0;

type

TPreventMediaRemoval=record

PreventMediaRemoval:BOOL;

end;

var

BytesReturned:Cardinal;

PMRBuffer:TPreventMediaRemoval;

begin

tMediaRemoval:=APreventRemoval;

Result:=DeviceIoControl(AVolumeHandle,IOCTL_STORAGE_MEDIA_REMOVAL,

@PMRBuffer,SizeOf(TPreventMediaRemoval),nil,0,BytesReturned,nil);

ifnotResultthen

RaiseLastWin32Error;

end;

functionAutoEjectVolume(AVolumeHandle:THandle):boolean;