Delphi Web浏览器WndProc中未接收到WM_LBUTTONUP

Delphi Web浏览器WndProc中未接收到WM_LBUTTONUP,delphi,webbrowser-control,c++builder,twebbrowser,Delphi,Webbrowser Control,C++builder,Twebbrowser,我已覆盖TWebBrowser的WndProc,以捕获鼠标点击,如下所示(快速示例): WM_LBUTTONDOWN正在发生,并且工作正常。但是有些东西会吃掉wmlbuttonup消息,而它永远不会发生。右键和中键也是一样 你知道为什么没有BUTTONUP消息吗?我最终放弃了上面的WndProc方法,通过取消onmousedown和onmouseup事件解决了这个问题,这两个事件也给了流程更多的控制,也允许了比上面更多的事件,此链接中描述的方法: 还可以在此处找到其他信息: 我最终放弃了上述W

我已覆盖TWebBrowser的WndProc,以捕获鼠标点击,如下所示(快速示例):

WM_LBUTTONDOWN
正在发生,并且工作正常。但是有些东西会吃掉
wmlbuttonup
消息,而它永远不会发生。右键和中键也是一样


你知道为什么没有BUTTONUP消息吗?

我最终放弃了上面的
WndProc
方法,通过取消
onmousedown
onmouseup
事件解决了这个问题,这两个事件也给了流程更多的控制,也允许了比上面更多的事件,此链接中描述的方法:

还可以在此处找到其他信息:


我最终放弃了上述
WndProc
方法,并通过将
onmousedown
onmousedup
事件下沉来解决问题,这两个事件也提供了对流程的更多控制,也允许了比上述更多的事件,此链接中描述了一种方法:

还可以在此处找到其他信息:


为什么要在
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
。在
LParam
的高位字中携带
WM\u LBUTTON…
值,而不是
WParam
。但是,您不能简单地查看
WParam
/
LParam
来区分消息,必须先查看
Msg
,然后查看
WParam
/
LParam
,只有在需要且有效的情况下才能这样做。在您的示例中并非如此。为什么要在
TMessage.WParam
字段中查找
WM_……
值,而不是在
TMessage.Msg
字段中?
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
。在
LParam
的高位字中携带
WM\u LBUTTON…
值,而不是
WParam
。但是,您不能简单地查看
WParam
/
LParam
来区分消息,必须先查看
Msg
,然后查看
WParam
/
LParam
,只有在需要且有效的情况下才能这样做。在你的例子中,情况并非如此。
procedure TWebBrowser.WndProc(var AMsg: TMessage);
begin
with AMsg do
  begin
   case WParam of
     WM_LBUTTONDOWN: Text := "DOWN";
     WM_LBUTTONUP:   Text := "UP";
  end;
end;