Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CBT_钩子、HCBT_最小最大事件或子分类以隐藏对话框窗口。C++;在窗户上_C++_Windows_Event Handling_Hook_Messaging - Fatal编程技术网

C++ CBT_钩子、HCBT_最小最大事件或子分类以隐藏对话框窗口。C++;在窗户上

C++ CBT_钩子、HCBT_最小最大事件或子分类以隐藏对话框窗口。C++;在窗户上,c++,windows,event-handling,hook,messaging,C++,Windows,Event Handling,Hook,Messaging,我试图阻止MS Access为加密的accdb文件打开的对话框密码窗口变得可见。(相反,我通过启动程序使用SendMessage API输入密码) 我尝试安装CBT_钩子,但是对话框窗口的HCBT_MINMAX事件不会以与其他常规窗口相同的方式触发,即:lParam的低阶字不包含预期的显示窗口值(我可以覆盖该值)。[对于常规窗口,它确实可以正常工作] 该窗口首先创建为隐藏,因此在HCBT_CREATEWND事件中修改CBT_CREATEWND结构没有帮助。[我尝试将->cx和->cy设置为0大小

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

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

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

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

我还尝试取消(返回0)窗口收到的大多数WM_u消息,例如WM_ACTIVATE、WM_SHOWWINDOW等,但没有成功

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

有什么想法吗

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

使用“窗口样式隐藏”启动Access没有帮助,因为主Access应用程序保持隐藏状态,但对话框不保持隐藏状态。]

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

在CBT_Hook子类中,对话框一创建(CBT_CREATEWND被激发)就立即启动

在window子类函数中,第一次调用时将window设置为transparent

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;
    }
现在窗口将不会在屏幕上闪烁