gpt4 book ai didi

delphi - 为什么当我使用 "message"指令时,我的控件中收不到消息?

转载 作者:行者123 更新时间:2023-12-03 15:47:51 24 4
gpt4 key购买 nike

创建控件后,我必须使用 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 的文档:

Applications send event notifications using the BroadcastSystemMessage function. Any application with a top-level window can receive basic notifications by processing the WM_DEVICECHANGE message. Applications can use the RegisterDeviceNotification function to register to receive device notifications.

使用AllocateHWnd 创建的窗口是顶级窗口。因此它接收广播消息。

您的自定义控件不是顶级窗口。如果您希望它接收消息,您必须调用 RegisterDeviceNotification 传递其窗口句柄。如果您这样做,请务必通过在 CreateWnd 中注册并在 DestroyWnd 中取消注册来处理 VCL 窗口重新创建。

根据一般经验,AllocateHwnd 是监听通知的首选方式。这是因为它不受 VCL 窗口重新创建的影响,因此不会错过通知。当重新创建 VCL 窗口时,有一个发送通知的机会窗口,但您的应用程序没有准备好接收的窗口。

这肯定会成为您的情况的一个问题,因此您应该使用AllocateHwnd。您可以安排使用 AllocateHwnd 创建的窗口归您的自定义控件所有,然后您可以将通知路由到该控件的代码。

关于delphi - 为什么当我使用 "message"指令时,我的控件中收不到消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31077056/

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