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