Win32:如何使HWND对点击透明?

3
我想要一个HWND,它对点击是透明的(即将点击事件传递给下方的窗口)。
起初我尝试了WS_EX_TRANSPARENT,但这会导致各种重绘问题。下方的窗口最终会覆盖我的HWND。
我进行了一些搜索,并发现通过响应WM_NCHITTEST并返回HTTRANSPARENT可以解决问题。这似乎有效,但MSDN指出,只有在下方的窗口与当前线程相同时才能正常工作。搜索HTTTRANSPARENT也出现了一些问题(http://www.virtualdub.org/blog/pivot/entry.php?id=147
那么...还有其他想法吗?

我从来没有在使用WM_NCHITTEST时遇到过问题。你的应用程序是否在不同的线程中创建窗口? - undefined
是的,这是一个专门设计用于在多个线程中调用的 Ui 库的一部分。 - undefined
1个回答

1

捕获所有鼠标消息,并使用PostMessage将它们转发到底层窗口。


听起来很棒,除了...你怎么找到窗口下面的内容呢?这对所有进程都适用吗? - undefined
你需要使用GetWindow函数(链接:http://msdn.microsoft.com/en-us/library/ms633515(VS.85).aspx)枚举所有顶级窗口,并检查它们的位置。当你找到一个窗口后,你将使用ChildWindowFromPoint函数(链接:http://msdn.microsoft.com/en-us/library/ms633558(VS.85).aspx)。 - undefined
这是一个非常天真的方法,在实践中不会奏效。例如,WM_NCMOUSEMOVE 消息可能不在窗口的非客户区上方,所以盲目地传递消息是不够的。在输入处理过程中还记录了大量的内部状态,而伪造消息时并没有记录这些状态(参见 SetForegroundWindow 以想象这将如何破坏)。这不是一个可行的解决方案。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接