【发布时间】:2020-10-01 16:40:39
【问题描述】:
我已经覆盖了TWebBrowser 的 WndProc 来捕获鼠标点击,如下所示(快速示例):
procedure TWebBrowser.WndProc(var AMsg: TMessage);
begin
with AMsg do
begin
case WParam of
WM_LBUTTONDOWN: Text := "DOWN";
WM_LBUTTONUP: Text := "UP";
end;
end;
WM_LBUTTONDOWN 正在发生并且工作正常。但是有些东西吃掉了WM_LBUTTONUP 消息,而且它永远不会发生。右键和中键也是一样的。
知道为什么没有 BUTTONUP 消息吗?
【问题讨论】:
-
为什么要在
TMessage.WParam字段而不是TMessage.Msg字段中查找WM_...值?WM_...值是消息 ID 常量,Msg字段携带正在接收的消息的 ID。WParam和LParam字段带有特定于消息的补充值。WM_LBUTTONDOWN的数值为$0201,WM_LBUTTONUP为$0202。其他消息可能会出于自己的目的使用这些相同的值,但您的代码不会知道其中的区别,因为它忽略了Msg字段。 -
也许这与
TWebBrowser组件有关,因为如果我使用 Msg 字段,那里什么都没有。但是 WParam 会根据点击发生变化,它不会在鼠标上移时发送任何消息。 Msg 中出现的实际值毫无意义,它是 $0021,而在鼠标向上(仅右键)时,它是 $0020,但不是左边的。使用 $0021 我无法区分左键、中键和右键,但使用 WParam 我实际上可以。 -
消息 ID $0021 是
WM_MOUSEACTIVATE,$0020 是WM_SETCURSOR。WM_MOUSEACTIVATE在LParam的高位字中携带WM_LBUTTON...值,而不是WParam。但是,您不能简单地查看WParam/LParam来区分消息,您必须先查看Msg,然后查看WParam/LParam,只有在需要且有效的情况下才能这样做。在您的示例中不是这种情况。
标签: delphi webbrowser-control c++builder twebbrowser