鼠标穿透窗口解决办法

鼠标穿透窗口
1.有两个窗口,分别是窗口A和窗口B,窗口B被A覆盖了。我想实现鼠标在窗口A上面的操作,实际上操作的是窗口B。

2.目前我知道有种方法,就是将窗口A样式设置成WS_EX_LAYERED|WS_EX_TRANSPARENT样式,使得窗口A为半透明,就可以实现鼠标在窗口A上面的动作,实际上操作的是窗口B。但是这种方法有个问题,窗口A会变成半透明,可是我不想让窗口A变成半透明。

3.除了上面这种方法外,还有没有其他的方法能实现这样的鼠标穿透的效果呢?并且不能使得窗口A变成半透明。

------解决方案--------------------
不懂帮顶啊
------解决方案--------------------
响应窗口A的WM_NCHITTEST消息,直接返回HTTRANSPARENT
------解决方案--------------------
帮顶
------解决方案--------------------
获得鼠标指针位置,这个不用我教吧?GetWindow 获得下面一个窗体的句柄,然后SendMessage WM_LBUTTONDOWN和WM_LBUTTONUP
------解决方案--------------------
窗口A 下面有N 个窗口,鼠标可能同时对应着若干个窗口, 所以各个窗口还是有一个Z-order 问题。
那么既然顶层窗口不用,就取下一个包含鼠标的Z 序最高的窗口, 系统api 不知道有没有, 如果没有
那就自己编一个吧。 稍微复杂点, 不过还是可以实现的。
------解决方案--------------------
找到B窗口,直接给他发消息
------解决方案--------------------
一直向下穿透,一直GetWindow GW_NEXT ,直到hDesktop

hDesktop=::GetDesktopWindow();


------解决方案--------------------
探讨
一直向下穿透,一直GetWindow GW_NEXT ,直到hDesktop

hDesktop=::GetDesktopWindow();

 

------解决方案--------------------
看下这两个函数SetCapture(); ReleaseCapture();
------解决方案--------------------
探讨
引用:
有一个办法。
用GetWindow和findwindow找到窗口A和B
然后当在A上点击鼠标时,在鼠标处理事件中,用sendMessage把鼠标消息传到窗口B中。这样B就能自动处理鼠标事件,而A对鼠标不会有响应。可能需要重载A中所有与鼠标有关的消息处理函数。可能需要禁用菜单什么的。
给你个页面,可能有帮助。


关键是我得不到窗口B的句柄啊

------解决方案--------------------
用SetCapture和ReleaseCapture,就可以解决你的问题
------解决方案--------------------
你这个问题其实很好解决,设置成WS_EX_LAYERED|WS_EX_TRANSPARENT样式,变成半透明了?SetLayeredWindowAttributes(hWnd,0,255,LWA_ALPHA);把透明度设成255就不透明了。
------解决方案--------------------
探讨
请问lint2008和Tr0j4n。

用GetWindow得到下一个窗口后,比如是窗口B,是不是要通过GetWindowRect获得窗口B的矩形,然后用PtInRect判断鼠标是不是在窗口B上。可是,如果窗口B是不规则窗体呢,那就没办法得到窗口B的范围,也就没办法判断鼠标是不是在窗口B里面了。

------解决方案--------------------
NCHITTEST HTTRANSPARENT

=====================================
Skin++ 让界面与逻辑彻底分离
精彩界面制作视频演示
www.uipower.com
------解决方案--------------------
探讨
请问lint2008和Tr0j4n。

用GetWindow得到下一个窗口后,比如是窗口B,是不是要通过GetWindowRect获得窗口B的矩形,然后用PtInRect判断鼠标是不是在窗口B上。可是,如果窗口B是不规则窗体呢,那就没办法得到窗口B的范围,也就没办法判断鼠标是不是在窗口B里面了。

------解决方案--------------------
探讨
引用:
你这个问题其实很好解决,设置成WS_EX_LAYERED|WS_EX_TRANSPARENT样式,变成半透明了?SetLayeredWindowAttributes(hWnd,0,255,LWA_ALPHA);把透明度设成255就不透明了。


你说的方法我已经实现了。但我不希望底层窗体时半透明的,所以不能采用这种方法。

------解决方案--------------------
你的情况用Hook做比较合适了
mouseMsgHook = SetWindowsHookEx(WH_MOUSE, GetMouseProc, hInstance, GetCurrentThreadId());

LRESULT CALLBACK GetMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode == HC_ACTION)