即使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 回答
为什么要将
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
.