使用ws_ex_transparent active c ++注册鼠标点击

时间:2015-09-03 22:32:03

标签: c++ windows winapi transparent

即使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);

1 个答案:

答案 0 :(得分:1)

为什么要将WS_EX_LAYAREDWS_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