【问题标题】:Generate a WM_NCHITTEST message生成 WM_NCHITTEST 消息
【发布时间】:2018-02-27 23:25:04
【问题描述】:

我正在尝试允许用户移动/调整 CEF 无边框窗口(使用 WS_POPUP 标志创建)。

鼠标位置在 CEF 浏览器中被捕获(使用 Javascript)并调用 C++ 回调。然后,我通过 IPC 从 C++ 回调向 CEF 浏览器进程发送一条消息(例如,该消息可以包含 HTRIGHT)。 最后一步是移动或调整浏览器的大小。 我想生成 WM_NCHITTEST 消息以允许窗口移动/调整大小。

我试图这样做:

PostMessage(getBrowserHwnd(), WM_NCHITTEST, 0, MAKELPARAM(cursorPos.x, cursorPos.y));

当然,它不起作用。

所以我的问题是:有没有办法生成 WM_NCHITTEST 消息? CEF 不允许我访问窗口的客户区,因此我的窗口过程不会收到任何鼠标事件。

任何帮助将不胜感激。

winapi包装器

【问题讨论】:

  • WM_NCHITTEST 有一个返回值,所以你必须使用SendMessage() 而不是PostMessage()
  • 感谢您的回复!不幸的是,它不起作用。似乎 CEF 在其自己的窗口过程中处理所有这些消息。
  • 对我来说听起来像是XY Problem。您真正想要完成什么?为什么您认为发送WM_NCHITTEST 是解决方案的一部分?
  • 是的,你是对的,那我就新建一个话题。

标签: c++ winapi chromium-embedded hittest borderless


【解决方案1】:

您正在生成WM_NCHITTEST,但命中测试不会启动任何操作,因为hit-testing can happen for reasons other than the mouse being over your window

我相信开始移动/调整大小操作的记录方法是使用WM_SYSCOMMAND,但我猜这不是您想要的,因为这与您必须选择的系统菜单中的操作相同移动/调整大小之前的一侧。

如果您可以处理消息,那么您可以返回 HTCLIENT 以响应 WM_NCHITTEST 或作为黑客您可以这样做:

PostMessage(getBrowserHwnd(), WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(cursorPos.x, cursorPos.y)); // cursorPos should be screen coordinates

【讨论】:

  • 感谢您的快速回复!不幸的是,这不起作用。 CEF 渲染器进程创建自己的子窗口并与我的窗口的客户区重叠。你知道是否有办法访问另一个窗口的过程吗?也许使用钩子?
  • 只要将 WM_NCLBUTTONDOWN hack 发布到正确的顶级窗口,它就应该可以工作。我对 CEF 一无所知,因此无法真正帮助您。
  • 还是谢谢你!这个技巧肯定会对其他目的有用,我会记住的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
  • 2013-06-30
  • 2019-10-29
  • 1970-01-01
  • 2014-12-20
  • 2016-11-25
相关资源
最近更新 更多