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

标签 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);

将它放在“最顶层”(最前面)使其可以作为覆盖层使用,但遗憾的是,它根本不会记录鼠标点击。

case WM_LBUTTONDOWN:
    PostQuitMessage(0); //does it listen?

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

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


解决方案原来是使用相当标准的 Hook 功能,包含在 Windows header 中。

键盘钩子(Hook)看起来与鼠标钩子(Hook)有点不同,但由于我是在鼠标钩子(Hook)之后,所以这是我发布的解决方案。 (如果你碰巧在寻找 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);

最佳答案

为什么要将 WS_EX_LAYAREDWS_EX_TRANSPARENT 混合在一起,而不是使用 Layered Transparency?

无论如何,请参阅这篇文章以获取有关 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

关于c++ - 使用 ws_ex_transparent active c++ 注册鼠标点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32386452/

相关文章:

windows - 如何在 Windows 开发环境中使用 OpenSSL for Rust

windows - MinGW 编译速度过慢

windows - Kotlin代码的运行时编译会引发RuntimeException(警告:无法为Windows初始化 native 文件系统)

c++ - 线程是否需要获得互斥量的所有权才能关闭互斥量的句柄

c++ - 如何将 SendMessage() 发送到在另一个线程上创建的窗口?

c++ - 如何使用 c++11 CAS 实现 ABA 计数器?

c++ - std::pair 与引用和引用包装器之间有什么区别

c++ - 在 C++ 中的类声明中初始化 const 成员

c++ - 引用 boost.fusion vector 中的元素

c++ - 确定与 URI 方案关联的默认图标