【发布时间】:2015-06-08 14:31:06
【问题描述】:
直到今天,我一直在使用以下代码在应用程序主窗体中捕获 WM_DEVICECHANGE 消息,并且它运行良好。但是,如果我尝试在我的自定义控件中使用它,我不会在设备插入或删除时收到通知。发生了什么?
TDriveBar = class(TCustomPanel)
private
procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
end;
implementation
procedure TDriveBar.WMDeviceChange(var Msg: TMessage);
const DBT_DEVICEARRIVAL = $8000;
DBT_DEVICEREMOVECOMPLETE = $8004;
DBT_DEVTYP_VOLUME = 2;
type PDEV_BROADCAST_HDR = ^DEV_BROADCAST_HDR;
DEV_BROADCAST_HDR = record
dbch_size: dword;
dbch_devicetype: dword;
dbch_reserved: dword;
end;
begin
case Msg.WParam of
DBT_DEVICEREMOVECOMPLETE:
if PDEV_BROADCAST_HDR(Msg.LParam)^.dbch_devicetype = DBT_DEVTYP_VOLUME then UpdateDrives;
DBT_DEVICEARRIVAL:
if PDEV_BROADCAST_HDR(Msg.LParam)^.dbch_devicetype = DBT_DEVTYP_VOLUME then UpdateDrives;
end;
end;
【问题讨论】:
-
RegisterDeviceNotification是唯一的解决方案吗?为什么我的代码不起作用? -
为什么它应该起作用?如果你没有分配内存,你可以使用它吗?如果你没有打开文件,你能写进去吗?如果您不要求通知,为什么您会收到通知?这里是纯 Win API - 你可以看到要求 windows 让你保持更新cyberforum.ru/win-api/thread987978.html
-
Marus,请阅读 WM_DEVICECHANGE 的#2 google 结果中的第一段:msdn.microsoft.com/en-us/library/windows/desktop/aa363215.aspx
-
好的,但是如果有人可以帮助我给出一个完整的答案来展示如何使用 register 函数,因为我不明白我应该传递什么参数......
标签: delphi delphi-2009 windows-messages