即使ws_ex_transparent启用,如何让我的窗口注册鼠标点击?
HWND hWnd = CreateWindowEx(WS_EX_LAYERED| WS_EX_TRANSPARENT, szAppName, wcWndName,
WS_VISIBLE | WS_POPUP, 255, 150, w, h,
NULL, NULL, hThisInst, NULL);
窗口标记为分层且透明,以及
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), SWP_FRAMECHANGED);
将它置于“最顶层”(infront)使其作为叠加层工作,但遗憾的是,它根本没有注册鼠标点击。
case WM_LBUTTONDOWN:
PostQuitMessage(0); //does it listen?
所以我的问题很简单:如何让我的分层,最顶部,透明的窗口注册我点击鼠标?
任何帮助都会很有帮助。感谢
解决方案原来是使用了一个相当标准的钩子功能,包含在windows标题中。
键盘钩子看起来与鼠标钩子有点不同,但是因为我在鼠标钩子之后,这就是我发布的解决方案。 (如果您碰巧寻找a keyboard hook)
mousehook; //global declaration
LRESULT CALLBACK HookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
PKBDLLHOOKSTRUCT k = (PKBDLLHOOKSTRUCT)(lParam);
if (wParam == WM_LBUTTONDOWN)
{
MessageBox(NULL, "LM is pressed", "key pressed", MB_ICONINFORMATION);
}
if (wParam == WM_RBUTTONDOWN)
{
MessageBox(NULL, "RM is pressed", "key pressed", MB_ICONINFORMATION);
}
return CallNextHookEx(Mousehook, nCode, wParam, lParam);
}
并在winmain中调用它(在msg之前)
Mousehook = SetWindowsHookEx(WH_MOUSE_LL, HookCallback, NULL, 0);
答案 0 :(得分:1)
为什么要将WS_EX_LAYARED
和WS_EX_TRANSPARENT
混合在一起,而不是使用分层透明度?
在任何情况下,请参阅此文章,了解有关WS_EX_TRANSPARENT
实际执行的操作的一些信息:
Like the cake, WS_EX_TRANSPARENT is a lie, or at least not the entire truth
根据您的要求,您需要处理WM_NCHITTEST
并让它返回HTCLIENT
而不是HTTRANSPARENT
,以便在透明窗口上显示您想要点击的任何区域。但是,WM_NCHITTEST
不适用于WS_EX_LAYERED
,因此您必须自行删除WS_EX_LAYERED
并使用WS_EX_TRANSPARENT
,然后处理WM_ERASEBKGND
并让它返回1没有绘制任何东西来获得透明效果。然后,您可以使用WM_NCHITTEST
。