CBT_Hook、HCBT_MINMAX事件或子类化以隐藏对话框窗口.C++在Windows上



我正在尝试阻止MS Access为加密的accdb文件打开的对话框密码窗口变得可见。(相反,我通过启动程序使用发送消息API输入密码)。

我尝试安装一个CBT_Hook,但是对话框窗口的HCBT_MINMAX事件与其他常规窗口的触发方式不同,即:lParam 的低阶字不包含预期的显示窗口值(然后我可以覆盖)。[对于常规窗口,它确实按预期工作]。

该窗口首先创建为隐藏的,因此修改HCBT_CREATEWND事件中的CBT_CREATEWND结构无济于事。[我尝试将 ->cx 和 ->cy 设置为 0 大小,但子窗口强制使用最小大小]

我还尝试对对话框窗口进行子类化(一旦触发HCBT_CREATEWND我就对其进行子类化),但在那之后,将 lParam 设置为 FALSE 对于WM_SHOWWINDOW消息并没有阻止窗口显示。

我还尝试取消(RETURN 0)窗口收到的大多数WM_消息,例如WM_ACTIVATE,WM_SHOWWINDOW等,但无济于事。

取消WM_NCCALCSIZE消息有所帮助,但这并没有阻止子窗口显示,因此它并没有真正的帮助。

有什么想法吗?

[目前,在启动 Access 之前,我每 10 毫秒枚举一次所有窗口,一旦找到密码对话框,我就会向它发送一条消息以隐藏,但即使每 10 毫秒这样做一次也会导致它在发现时闪烁一次,我想防止这种情况。

使用隐藏的窗口样式启动 Access 无济于事,因为主 Access 应用程序保持隐藏状态,但对话框则不然。

实现此目的的方法(以及隐藏另一个进程在创建时创建的对话框的其他类似方案)如下):

在CBT_Hook子类中,对话框在创建(CBT_CREATEWND触发)后立即启动。

在窗口子类函数中,将窗口设置为第一次调用时透明。

if (done != TRUE) {
        LONG_PTR exstyle = GetWindowLongPtr(hwnd, GWL_EXSTYLE);
        if (!(exstyle & WS_EX_LAYERED)) {
            SetWindowLongPtr(hwnd, GWL_EXSTYLE, exstyle | WS_EX_LAYERED);
        }
        SetLayeredWindowAttributes(hwnd, 0, 0, LWA_ALPHA);
        done = TRUE;
    }

现在窗口不会在屏幕上闪烁。

相关内容

  • 没有找到相关文章

最新更新