【发布时间】:2015-06-26 15:31:58
【问题描述】:
创建控件后,我必须使用DeviceWnd:=AllocateHWnd(DeviceWindowProc); 接收WM_DEVICECHANGE 消息。然后……
procedure TFileList.DeviceWindowProc(var Message: TMessage);
begin
case Message.Msg of
WM_DEVICECHANGE: begin
case Message.WParam of
DBT_DEVICEREMOVECOMPLETE, DBT_DEVICEARRIVAL:
if PDEV_BROADCAST_HDR(Message.LParam).dbch_devicetype = DBT_DEVTYP_VOLUME then
OnDeviceChange;
end;
end;
end;
Message.Result:=DefWindowProc(DeviceWnd, Message.Msg, Message.WParam, Message.LParam);
end;
这很好用,但是当我这样做时,为什么我没有收到该消息? :
TFileList = class(TCustomControl)
private
procedure DeviceChage(var AMessage:TMessage); message WM_DEVICECHANGE;
end;
procedure TFileList.DeviceWindowProc(var Message: TMessage);
begin
Message.Result:=DefWindowProc(DeviceWnd, Message.Msg, Message.WParam, Message.LParam);
end;
procedure TFileList.DeviceChage(var AMessage:TMessage);
begin
case AMessage.WParam of
DBT_DEVICEREMOVECOMPLETE, DBT_DEVICEARRIVAL:
if PDEV_BROADCAST_HDR(AMessage.LParam).dbch_devicetype = DBT_DEVTYP_VOLUME then
OnDeviceChange;
end;
end;
【问题讨论】:
-
你用过
RegisterDeviceNotification吗?您必须这样做,因为WM_DEVICECHANGE消息仅广播到顶层窗口。 -
不,没有
RegisterDeviceNotification,消息接收得很好,但是当我使用“消息”指令时没有收到。 -
@MarusNebunu:注意 TLama 所说的话。
WM_DEVICECHANGE默认只广播到顶级窗口。您的控件不是顶级窗口,AllocateHWnd()是。如果控件想要该消息,它必须使用RegisterDeviceNotification()来请求它。 -
我已经告诉过你the last time you asked about this:“操作系统向所有顶级窗口发送
wm_DeviceChange消息。应用程序的主窗体是顶级窗口,但您的控件不是,这是为什么表单会收到消息而您的控件没有。”
标签: delphi delphi-2009 messages