我需要创建一个透明的覆盖窗口,它位于另一个窗口之上。另一个窗口来自其他供应商。当用户拖动那个我需要关注的窗口时。
WS-CHILD似乎是一个不错的主意,但它不能与我真正需要的WS-EX-LAYERED,结合使用(透明度)。但是我仍然可以在不使用WS-CHILD的情况下设置父级。
Parenting确实提供了我的winproc通知(WM-WINDOWPOSCHANGING),但只有在拖动完成后才能进行鼠标操作。为了给人一种愉快的感觉,我需要在拖动的同时连续获得这些通知(或者例如WM-MOVE)。
我想我的问题与对接类似,但在CodeProjet看到fx的精细对接解决方案使用的是WS-CHILD。 (http://www.codeproject.com/KB/toolbars/dockwnd.aspx)
我想我可以使用民意调查,但这不是我想要的。我也可以使用:: SetWindowsHook()。但那是我最后的选择。我希望我错过了一些微不足道的事情,有人可以指出我的方向。
感谢名单
答案 0 :(得分:4)
我知道这不是您首选的解决方案,但我认为您需要使用全局鼠标挂钩。将WH_MOUSE_LL
传递给SetWindowsHookEx()
,并在您的低级鼠标proc的默认情况下不执行任何操作。但是当您收到WM_WINDOWPOSCHANGING
通知时,请开始跟踪鼠标移动并对MoveWindow()
或其他任何内容进行适当的调用。
答案 1 :(得分:1)
我使用LayeredWindow并将另一个窗口设置为父窗口。
这是我用过的代码:
::SetWindowLong(GetHwnd(), GWL_EXSTYLE, GetWindowLong(GetHwnd(), GWL_EXSTYLE) |WS_EX_LAYERED);
::SetLayeredWindowAttributes(GetHwnd(), RGB(255,0,255), 255, LWA_COLORKEY | LWA_ALPHA);
::SetWindowLongPtr(GetHwnd(),GWLP_HWNDPARENT,(long)GetParentHWND());
::SetWindowPos(hndOtherWindow, hndOverlayWinow, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE |SWP_NOACTIVATE);
它适用于我的目的。只剩下一个问题:如果我的覆盖窗口失去了焦点,我想设置焦点,或者激活另一个窗口。你有什么想法吗?
答案 2 :(得分:0)
WM_MOVING消息怎么样?您可以尝试拦截此消息并相应地移动窗口。
答案 3 :(得分:0)
如果您想知道何时移动或调整其他进程中的窗口,您需要安装一个钩子,捕获WM_MOVING和WM_SIZING消息并将这些消息反映回控制器进程。对不起,这不是你想要的答案!我不怪你想要避免跨进程钩子,它有点痛苦......