如何使用WinAPI读取MessageBox文本

如何阅读标准Win消息框(Info)的消息?

运用

SendMessage(this.HandleControl, WM_GETTEXT, builder.Capacity, builder); 

我只能读取消息框的头部或button的文本,而不是消息本身。

谢谢。

Notes(来自Q&A):

this.HandleControl是消息框窗口的处理程序

Spy ++显示没有子控件禁止button。 这就是让我以为消息框有自己的方式来保持文本无法使用标签

这是一个用delphi编写的遗留应用程序,该button的类是按照Spy ++的TButton,但仍然没有控件,除了对话窗口内的button。

在检查记事本窗口后,图像和文本都是“可选的”,我猜我的应用程序不使用std MessageBox。 但是,我该如何解决这个问题呢? 我可以看到,我的delphi应用程序中没有标签可以通过Spy ++ Finder工具select。

Solutions Collecting From Web of "如何使用WinAPI读取MessageBox文本"

消息文本位于模式MessageBox对话窗口的标签控件中。 您必须获取MessageBox对话框(win32 API FindWindow)的窗口句柄,然后检索控件(win32 API GetDlgItem)的窗口句柄,然后从窗口win32 API GetWindowText中检索文本。

编辑 –

 TCHAR text[51] = {0}; HWND msgBox = ::FindWindow(NULL, TEXT("MessageBoxCaption")); HWND label = ::GetDlgItem(msgBox, 0xFFFF); ::GetWindowText(label, text, sizeof(text)-1); 

尝试模拟复制操作(Ctrl-C),然后从剪贴板中获取文本:messageboxes允许以这种方式复制整个内容(如果它们正确完成)。

OP评论说: 这工作,谢谢。 我最终可能会这样做。 理想情况下,我们希望保持我们的执行重点是独立的,但是在专用PC和OCR之间进行选择,我可能会选择第一条路线。

就我个人而言,我已经在Delphi 6中测试过了,它看起来像这样:

 --------------------------- Confirm --------------------------- You are about to close the program WARNING: Are you sure? --------------------------- Yes No --------------------------- 

注意:这是基于“Stefan”在对原始问题的评论中提出的答案