使用 ws_ex_transparent active c++ 注册鼠标点击
Registering mouseclicks with ws_ex_transparent active c++
如何让我的 window 在 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);
window 被标记为分层和透明的,以及
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), SWP_FRAMECHANGED);
将其放置 "topmost"(前面)使其可以用作叠加层,但遗憾的是,它根本不会记录鼠标点击。
case WM_LBUTTONDOWN:
PostQuitMessage(0); //does it listen?
所以我的问题很简单:如何让我的分层、最顶层、透明 window 注册我点击鼠标?
任何帮助都会很有帮助。谢谢
解决方案 原来是使用相当标准的挂钩功能,包含在 windows header.
键盘钩子看起来与鼠标钩子有点不同,但由于我是在鼠标钩子之后,所以这是我发布的解决方案。 (如果你碰巧在寻找 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_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
并将其设置为 return HTCLIENT
而不是 HTTRANSPARENT
以用于您希望可点击的任何区域透明 window。但是,WM_NCHITTEST
不适用于 WS_EX_LAYERED
,因此您必须删除 WS_EX_LAYERED
并单独使用 WS_EX_TRANSPARENT
,然后处理 WM_ERASEBKGND
并将其 return 1 不画任何东西以获得透明效果。然后你可以使用 WM_NCHITTEST
.
如何让我的 window 在 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);
window 被标记为分层和透明的,以及
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), SWP_FRAMECHANGED);
将其放置 "topmost"(前面)使其可以用作叠加层,但遗憾的是,它根本不会记录鼠标点击。
case WM_LBUTTONDOWN:
PostQuitMessage(0); //does it listen?
所以我的问题很简单:如何让我的分层、最顶层、透明 window 注册我点击鼠标?
任何帮助都会很有帮助。谢谢
解决方案 原来是使用相当标准的挂钩功能,包含在 windows header.
键盘钩子看起来与鼠标钩子有点不同,但由于我是在鼠标钩子之后,所以这是我发布的解决方案。 (如果你碰巧在寻找 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_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
并将其设置为 return HTCLIENT
而不是 HTTRANSPARENT
以用于您希望可点击的任何区域透明 window。但是,WM_NCHITTEST
不适用于 WS_EX_LAYERED
,因此您必须删除 WS_EX_LAYERED
并单独使用 WS_EX_TRANSPARENT
,然后处理 WM_ERASEBKGND
并将其 return 1 不画任何东西以获得透明效果。然后你可以使用 WM_NCHITTEST
.