gpt4 book ai didi

delphi - 仅向无形 { dpr } 的 Delphi 应用程序添加 USB 检测

转载 作者:行者123 更新时间:2023-12-03 19:40:14 27 4
gpt4 key购买 nike

是否可以将 USB 检测添加到无格式(仅限 dpr)Delphi 程序中?
我已经编写了检测类,但它似乎只有在我向程序中添加表单时才有效。

这是类(class)

unit uMyUSB;

interface

uses

Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes,
Winapi.ShellApi, Vcl.Dialogs;

// Start of Declarations

const
DBT_DEVICEARRIVAL = $00008000;
DBT_DEVICEREMOVECOMPLETE = $00008004;
DBT_DEVTYP_VOLUME = $00000002;
DBTF_MEDIA = $00000001;
USB_INTERFACE = $00000005;

// Device structs
type
PDevBroadcastDeviceInterface = ^_DEV_BROADCAST_HDR;

_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;

// End of Declarations

type

TUSB = class(TObject)
private
FHandle: HWND;
procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
procedure WinMethod(var Msg: TMessage);
procedure RegisterUsbHandler;
{ Public declarations }
public
{ Public declarations }
constructor Create();
destructor Destroy(); override;
end;

implementation

constructor TUSB.Create();
begin
inherited Create;
FHandle := AllocateHWnd(WinMethod);
RegisterUsbHandler;
end;

destructor TUSB.Destroy();
begin
DeallocateHWnd(FHandle);
inherited Destroy;
end;

procedure TUSB.WinMethod(var Msg: TMessage);
begin
if (Msg.Msg = WM_DEVICECHANGE) then
begin
WMDeviceChange(Msg);
end
else
begin
Msg.Result := DefWindowProc(FHandle, Msg.Msg, Msg.WParam, Msg.LParam);
end;

end;

procedure TUSB.RegisterUsbHandler;
var
rDbi: _DEV_BROADCAST_HDR;
iSize: Integer;
begin
iSize := SizeOf(_DEV_BROADCAST_HDR);
ZeroMemory(@rDbi, iSize);
rDbi.dbch_size := iSize;
rDbi.dbch_devicetype := USB_INTERFACE;
rDbi.dbch_reserved := 0;

RegisterDeviceNotification(FHandle, @rDbi, DEVICE_NOTIFY_WINDOW_HANDLE);
end;

procedure TUSB.WMDeviceChange(var Msg: TMessage);
var
lpdbhHeader: PDevBroadcastHeader;

begin
lpdbhHeader := PDevBroadcastHeader(Msg.LParam);

case Msg.WParam of
DBT_DEVICEARRIVAL:
begin
if (lpdbhHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
begin
ShowMessage('Inserted');

end;

end;
DBT_DEVICEREMOVECOMPLETE:
begin
if (lpdbhHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
begin
ShowMessage('Removed');
end;

end;
end;


end;

这是TestUnit
// My dpr Program

program TestUSB;

uses
System.SysUtils,
System.Classes,
uMyUSB in 'Sources\uMyUSB.pas';

{$R *.res}

var
FUSB: TUSB;

begin
{$WARNINGS OFF}
ReportMemoryLeaksOnShutdown := DebugHook <> 0;
{$WARNINGS ON}

FUSB := TUSB.Create();

// Loop to keep the Program Running Continually.
while 1 = 1 do
begin
// Do Something
end;

FreeandNil(CustomUsb);

end.

如何让无形程序接受 USB 更改 (WM_DEVICECHANGE) 命令?

多谢。

德尔福 XE7。

最佳答案

尽管消息是同步的,即非排队的,但您确实需要调度消息才能传递同步消息。当您调用 GetMessage 时,通常消息分发由消息循环完成。或类似的功能。

您的应用程序没有消息循环,也不分派(dispatch)消息。您只需要安排您的程序发送消息。添加一个消息循环就可以了。但是你只需要做一些发送消息的事情。不需要是一个完整的消息循环。例如,您可以将循环替换为:

while True do
SendMessage(hwnd, WM_NULL, 0, 0);

这可以满足您的需求,因为 SendMessage是发送消息的函数之一。

您需要决定使用哪个窗口句柄。您可以使用您创建的窗口句柄。或者您可能会将消息发送到值为 0 的无效窗口句柄。 .

或者你可以决定运行一个标准的消息循环:
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;

关于delphi - 仅向无形 { dpr } 的 Delphi 应用程序添加 USB 检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30505041/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com