gpt4 book ai didi

c# - SendMessage 和 WM_CLOSE

转载 作者:行者123 更新时间:2023-11-30 17:56:27 50 4
gpt4 key购买 nike

我正在创建一个简单的 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 关闭以及为什么有些消息框不会被关闭,我将非常感激。

最佳答案

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

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

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

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

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

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

private const int WM_COMMAND = 0x111;<br/>
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;

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

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

关于c# - SendMessage 和 WM_CLOSE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14159459/

50 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com