【发布时间】:2017-05-23 00:38:07
【问题描述】:
我正在创建的程序不拥有进程中的主窗口。我正在使用Windows Hook 将 DLL 注入此进程,以便将子窗口添加到此主窗口。
我的最终目标是创建一个WS_EX_LAYERED 窗口,它允许我创建一个内部彩色边框,但允许中心部分是透明的并允许鼠标点击。这部分工作完美。
WNDCLASS wndClass = {};
wndClass.style = CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = OverlayProc;
wndClass.hInstance = g_TargetInstance;
wndClass.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(0, 255, 255));
wndClass.lpszClassName = "OVERLAY";
RegisterClass(&wndClass);
g_Window = CreateWindowEx(WS_EX_LAYERED | WS_EX_TRANSPARENT, "OVERLAY", nullptr,
WS_CHILDWINDOW, rect.left, rect.top, rect.right+1, rect.bottom+1, data->hwnd, nullptr, g_TargetInstance, nullptr);
SetLayeredWindowAttributes(g_Window, RGB(0, 255, 255), 0, LWA_COLORKEY);
ShowWindow(g_Window, SW_SHOW);
UpdateWindow(g_Window);
第二部分是我想有条件地阻止所有鼠标输入到父窗口。我无法使用 WS_EX_LAYERED 窗口的透明部分执行此操作,因此我尝试创建第二个透明 STATIC 控件作为主窗口的子窗口,但这也不会阻止鼠标输入。
我还通过调用PostMessage 将模拟鼠标点击发送到父窗口,传递WM_LBUTTONDOWN 和WM_LBUTTONUP。如何通过透明窗口阻止所有鼠标输入到父窗口?
【问题讨论】:
-
您可以将 SetLayeredWindowAttributes 的第三个参数设置为 1 而不是 0。
-
你不想使用 SetWindowsHookEx,是吗?
-
“我还通过调用
PostMessage将模拟的鼠标点击发送到父窗口” - 这不是模拟输入。这是装的。它也在做a damn poor job。 -
@IInspectable 我不确定你是否理解
simulate这个词的含义。模拟输入与“伪造”输入完全相同。另外,我不是也没有说我在“伪造”键盘输入,但需要明确的是,我确实有一个使用PostMessage来“伪造”键盘输入的测试功能,在我的情况下,它可以完美可靠地运行,所以说这是一个“该死的糟糕工作”是相当主观的。 -
@KonstantinL 我正在使用 SetWindowsHookEx,我确实想使用它,但仅用于将我自己的消息处理程序和窗口注入目标进程的车辆。