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

标签 delphi usb

是否可以将 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/

相关文章:

forms - 如何在 Delphi 屏幕键盘窗体中使用窗口焦点消息

c - 如何使用 libusb 获取设备类特定描述符

delphi - 如何找到以前的主动控制: Delphi

delphi - 有没有一种简单的方法来克隆字符串数组?

delphi - 64 位 Delphi 目标可以静态链接到已编译的 C 目标文件吗?

c++ - Windows - USB 控制请求问题

android - 在 Galaxy SII 上安装 Android USB 驱动程序时出现问题

delphi - Delphi 中的 Web 应用程序

android - 包 X 需要不可用的共享库 com.android.future.usb.accessory

c - 防止 macOS 通用键盘驱动程序捕获 USB 设备