我正在创建一个简单的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关闭,为什么有些消息不会让我真的很感激呢。
答案 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
以外的任何东西都是不明智的。