WebBrowser WndProc 中未收到 WM_LBUTTONUP

Posted

技术标签:

【中文标题】WebBrowser WndProc 中未收到 WM_LBUTTONUP【英文标题】:WM_LBUTTONUP not received in WebBrowser WndProc 【发布时间】: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。 WParamLParam 字段带有特定于消息的补充值WM_LBUTTONDOWN 的数值为 $0201WM_LBUTTONUP$0202。其他消息可能会出于自己的目的使用这些相同的值,但您的代码不会知道其中的区别,因为它忽略了 Msg 字段。 也许这与TWebBrowser 组件有关,因为如果我使用 Msg 字段,那里什么都没有。但是 WParam 会根据点击发生变化,它不会在鼠标上移时发送任何消息。 Msg 中出现的实际值毫无意义,它是 $0021,而在鼠标向上(仅右键)时,它是 $0020,但不是左边的。使用 $0021 我无法区分左键、中键和右键,但使用 WParam 我实际上可以。 消息 ID $0021 是 WM_MOUSEACTIVATE,$0020 是 WM_SETCURSORWM_MOUSEACTIVATELParam 的高位字中携带 WM_LBUTTON... 值,而不是 WParam。但是,您不能简单地查看WParam/LParam 来区分消息,您必须先查看Msg,然后查看WParam/LParam,只有在需要且有效的情况下才能这样做。在您的示例中不是这种情况。 【参考方案1】:

我最终放弃了上述WndProc 方法,并通过接收onmousedownonmouseup 事件解决了这个问题,这也提供了对过程的更多控制,并且还允许比上面,这个链接上描述的一个方法:

https://www.thoughtco.com/url-hyperlink-twebbrowser-document-1058415

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

IhtmlDocument2 and Internet Explorer 11 changes on Windows 7

【讨论】:

以上是关于WebBrowser WndProc 中未收到 WM_LBUTTONUP的主要内容,如果未能解决你的问题,请参考以下文章

标准 win32 wndproc 中的第一次机会异常

子窗口没有收到 WM_DESTROY?

在 iPhone 中未收到任何推送通知

某些设备在 android 中未收到推送通知

为啥在 Internet Explorer 中未收到 POST 响应数据?

在 iOS 中未收到推送通知消息