首页 文章

使用ws_ex_transparent active c注册鼠标点击

提问于
浏览
0

即使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?

所以我的问题很简单:如何让我的分层,最顶部,透明的窗口注册我点击鼠标?

任何帮助都会很有帮助 . 谢谢


The solution 结果是使用了一个相当标准的钩子功能,包含在windows Headers 中 .

键盘钩子看起来与鼠标钩子有点不同,但是因为我在鼠标钩子之后,这就是我发布的解决方案 . (如果你碰巧寻找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 回答

  • 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 .

相关问题