SendMessage和WM_CLOSE

时间:2013-01-04 14:55:18

标签: c#

我正在创建一个简单的C#应用​​程序来监视服务器上的已售出的应用程序,如果有任何消息框提出特定的窗口名称来关闭窗口并继续该过程。 供应商随机出现信息性消息框,挂起应用程序,直到单击X或OK按钮。有两种类型的消息框出现,一种是关闭而没有问题使用我的应用程序,但另一种没有。它们看起来非常相似,只是一个嵌入了sql文本作为消息的一部分。两个消息框都是由FindWindow找到的,就在SendMessage运行时它不会关闭第二种类型的消息框,即使它看到了它。我也试过PostMessage,我也遇到了同样的问题。

这就是我所拥有的:

    private const int WM_CLOSE = 0x10;

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern int SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

    IntPtr ErrorPopUp = FindWindow(null, WindowToClose.Trim());
                        if (ErrorPopUp != IntPtr.Zero) {
                            try {
                                Thread.Sleep(200);
                                SendMessage(ErrorPopUp, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
                                _WMExceptionDal.LogErrorMsg(_WMException);

                            } catch (Exception ex) {
                                _WMException.txt_iferror = "Unable to close the popup window";
                                _WMException.txt_sqlerrtext = ex.ToString();
                                _WMExceptionDal.LogErrorMsg(_WMException);
                            }
                        }

任何其他方法的建议,或者如果我做错了为什么有些消息框会被WM_CLOSE关闭,为什么有些消息不会让我真的很感激呢。

1 个答案:

答案 0 :(得分:1)

答案比你想象的要简单:你得到的错误弹出窗口有一个“确定”按钮,窗口标题栏区域没有“关闭”按钮。

它们非常非常原始:窗口proc的消息处理仅限于对话框按钮背后的功能:

SendMessage(ErrorPopUp, WM_COMMAND, IDOK, IntPtr.Zero);

如果你发送它WM_CLOSE没有人回家:该窗口的消息处理程序中没有任何内容可以响应该消息。是的,有一段时间我认为所有窗口也响应WM_CLOSE消息。

对话框窗口也有限制响应来自其他线程的“关闭”消息,但我不认为这是发生在这里的事情。 (但是,如果对话框 在标题栏中有一个'x'按钮关闭它,并且它没有响应您的WM_CLOSE消息,这是最可能的解释。

无论哪种方式,您都会向其发送错误消息:创建对话框是为了响应按钮上列出的用户输入,这些是您发送的消息 - WM_COMMAND带有消息标识符:

private const int WM_COMMAND = 0x111;
private const int dlgOK = 0x1; private const int dlgCANCEL = 0x2; private const int dlgABORT = 0x3; private const int dlgRETRY = 0x4; private const int dlgIGNORE = 0x5; private const int dlgYES = 0x6; private const int dlgNO = 0x7;

问题'哪个标识符?'通常无关紧要 - 你知道这里的'确定' - 但是如果需要,User32函数GetDlgItem()将检查哪些对话框函数存在问。

另外:注意带有“取消”按钮的对话框 - 在对话框中有取消功能的实现,启用窗口菜单并在标题栏中给出一个关闭的“x”按钮,并且一些这些实现会响应WM_CLOSE消息(它们也应该响应WM_SYSCOMMAND, SC_CLOSE);但是依靠WM_COMMAND, dlgCANCEL以外的任何东西都是不明智的。

相关问题