sendMessage 到隐藏窗口不起作用

Posted

技术标签:

【中文标题】sendMessage 到隐藏窗口不起作用【英文标题】:sendMessage to a hidden window did not work 【发布时间】:2018-12-02 05:39:13 【问题描述】:

我想在窗口的按钮上发送一个点击消息,它的标题是“Form1”,按钮的标题是“button1”这是我的代码:

我通过 SPY++ 检查了这个句柄似乎是正确的..

    #include "stdafx.h"
    #include <windows.h>
    #include <conio.h>

    int main()
    
     while(1)
     
       HWND HWin, btn;
       HWin = FindWindowExA(NULL,NULL,NULL,"Form1");
       btn = FindWindowExA(HWin,0,NULL,"button1");
       SendMessage(btn,BM_CLICK,0,0);
       _getch();
      
    

这段代码运行良好,一切都很好......但是当“Form1”设置为隐藏时 sendMessage 似乎不起作用!为什么???

注意FindWindowExA(...) 在 "Form1" 隐藏时仍然返回相同的句柄,并且与前一个相同(显示时)

设置“Form1”的隐藏/显示是通过以下几行完成的:

显示:

    ShowWindow(HWin,SW_SHOW);

隐藏:

    ShowWindow(HWin,SW_HIDE);

我在 VS 2010 上运行

我想知道 sendMessage 是否在隐藏窗口上不起作用,还有其他方法吗??

谢谢大家

【问题讨论】:

根据BM_CLICK 文档:“如果按钮在对话框中并且对话框未处于活动状态,则 BM_CLICK 消息可能会失败。”为什么会这样?向隐藏的窗口发送点击(面向视觉的操作)会成功吗? 【参考方案1】:

我假设您正在明智地检查以确保在执行消息传递代码之前隐藏窗口时您的 FindWindow 调用不会返回 NULL。

假设您从 FindWindow 返回有效的 HWND,而不是发送到按钮本身的 BM_CLICK 消息。尝试向父窗口发送WM_COMMAND 消息。

if (HWin && btn)

    LONG ctrlId = GetWindowLong(btn, GWL_ID);
    SendMessage(HWin, WM_COMMAND, MAKEWORD((WORD)ctrlId, BN_CLICKED), (LPARAM)btn);

如果应用程序本身处于隐藏状态下不期待点击通知的状态,则可能会出现一些非常奇怪的行为。

我认为这适用于 win32 应用程序或对话框。不确定 .NET 表单应用程序。

【讨论】:

以上是关于sendMessage 到隐藏窗口不起作用的主要内容,如果未能解决你的问题,请参考以下文章

带有用于 IPC 的 WndProc 覆盖的本机 SendMessage 不起作用

引导弹出窗口切换事件不起作用

使用 inappbrowser 隐藏和显示方法在 phonegap 应用程序中不起作用

如何在 SwiftUI 中隐藏 macOS 中视图/窗口的状态栏?

窗口挂钩在 Windows 7 中不起作用,但在 Windows xp 中不起作用

使用属性更改简单绑定到用户控件在 vs 扩展工具窗口中不起作用