Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.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# 检测程序消息框 我有一个C++游戏,在Windows 10上启动时,有时会显示消息框< /C>错误,并且不会正常启动。80%的时间它将正常启动,我可以使用它_C# - Fatal编程技术网

C# 检测程序消息框 我有一个C++游戏,在Windows 10上启动时,有时会显示消息框< /C>错误,并且不会正常启动。80%的时间它将正常启动,我可以使用它

C# 检测程序消息框 我有一个C++游戏,在Windows 10上启动时,有时会显示消息框< /C>错误,并且不会正常启动。80%的时间它将正常启动,我可以使用它,c#,C#,我想避免多次手动启动它,所以我在考虑为自己制作一个应用程序 但我的意思是——试着启动游戏。等待消息框检测。如果它确实检测到消息框,请停止游戏并重试。如果5秒钟后没有消息框,请退出应用程序 我知道我可以使用FindWindow,然后使用GetDlgItem和GetWindowText检查这是否是一个MessagBox,但它似乎不起作用 [DllImport("user32.dll")] private static extern IntPtr FindWindow(string l

我想避免多次手动启动它,所以我在考虑为自己制作一个应用程序

但我的意思是——试着启动游戏。等待
消息框
检测。如果它确实检测到
消息框
,请停止游戏并重试。如果5秒钟后没有
消息框
,请退出应用程序

我知道我可以使用
FindWindow
,然后使用
GetDlgItem
GetWindowText
检查这是否是一个
MessagBox
,但它似乎不起作用

    [DllImport("user32.dll")]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    internal static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);
    [DllImport("user32.dll")]
    static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem);

    static void Main(string[] args)
    {
        IntPtr gameHandle = FindWindow(null, "Game");

        while (gameHandle == IntPtr.Zero)
        {
            gameHandle = FindWindow(null, "Game");
        }

        IntPtr dlgHandle = GetDlgItem(gameHandle, 0xFFFF);
        StringBuilder sb = new StringBuilder();
        GetWindowText(dlgHandle, sb, 30);
        Console.WriteLine(sb.ToString());
    }
由于某些原因,
dlgHandle
返回0

在我解决了这个问题之后,我可以检查
MessageBox
文本是否与错误匹配,然后我就可以知道它是否是错误。为什么它返回0呢


编辑:我担心游戏正在使用自己的
MessageBox
实现,这就是
GetDlgItem
返回0的原因。下面是它发送的
消息框的图片:

你用Spy++戳过它了吗?这是另一条路。如果是WPF或其他奇怪的事情,你可能会有麻烦,但当你到达那里时,就过那座桥。@EdPlunkett这是一个很好的建议。使用了Spy++,它说这个类是
#32770(Dialog)
。我试图在该类上使用
FindWindowsEx
,但它仍然返回0。对于文本块本身?在一个普通的Win32 MessageBox上,我在对话框中得到了它(它是Win32 CreateDialog对话框的标准windowclass),但是如果我将十字光标拖动到文本本身上(当我在上面时它会得到一个黑色的轮廓),我会将该类视为“静态”类。我松开鼠标,在十字光标对话框中单击“确定”,我会看到静态控件的属性检查器对话框:控件ID
0000FFFF
,等等。Win32将标签称为“静态”控件,就像在“Static text”@EdPlunkett中,它对块和文本都是这样做的。当然,只有当我将它指向OK按钮时,它才会有所不同。但是它在文本和窗口上都显示
#32770(Dialog)
。@EdPlunkett如果我检查进程的类怎么办?如果它不是
#32770(Dialog)
,那么我知道该流程已正确启动。你觉得怎么样?你用Spy++戳过它吗?这是另一条路。如果是WPF或其他奇怪的事情,你可能会有麻烦,但当你到达那里时,就过那座桥。@EdPlunkett这是一个很好的建议。使用了Spy++,它说这个类是
#32770(Dialog)
。我试图在该类上使用
FindWindowsEx
,但它仍然返回0。对于文本块本身?在一个普通的Win32 MessageBox上,我在对话框中得到了它(它是Win32 CreateDialog对话框的标准windowclass),但是如果我将十字光标拖动到文本本身上(当我在上面时它会得到一个黑色的轮廓),我会将该类视为“静态”类。我松开鼠标,在十字光标对话框中单击“确定”,我会看到静态控件的属性检查器对话框:控件ID
0000FFFF
,等等。Win32将标签称为“静态”控件,就像在“Static text”@EdPlunkett中,它对块和文本都是这样做的。当然,只有当我将它指向OK按钮时,它才会有所不同。但是它在文本和窗口上都显示
#32770(Dialog)
。@EdPlunkett如果我检查进程的类怎么办?如果它不是
#32770(Dialog)
,那么我知道该流程已正确启动。你怎么认为?