【问题标题】:How do I read MessageBox text using WinAPI如何使用 WinAPI 读取 MessageBox 文本
【发布时间】:2011-05-12 13:40:06
【问题描述】:

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

使用

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

我只能读取消息框的标题或按钮的文本,而不能读取消息本身。

谢谢。

笔记(来自问答):

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

Spy++ 没有显示按钮栏的子控件。这就是让我想到消息框有自己的方式来保存文本而不使用标签的原因

这是一个用delphi编写的遗留应用程序,按钮的类是Spy++中的TButton,但除了对话框窗口中的按钮之外,仍然没有其他控件。

检查记事本窗口后,图像和文本都是“可选择的”,我猜我的应用程序没有使用标准消息框。仍然,我该如何从事物中提取文本?我可以看到 Spy++ Finder 工具无法选择我的 delphi 应用程序中的任何标签。

【问题讨论】:

  • 我们在这里讨论的是什么种类的消息框?由 Win32 API 创建的标准 MessageBox 类型的消息框?他们肯定有一个包含文本的标签控件。自 Windows 95 以来,该控件的 ID 一直是 0xFFFF。您绝对应该使用 Spy++ 看到它。用更多细节更新您的问题。
  • 如果没有窗口句柄,那么您将不得不进行屏幕抓取和 OCR。
  • 尝试模拟复制操作 (Ctrl-C),然后从剪贴板中获取文本:消息框允许以这种方式复制整个内容(如果操作正确)。
  • @Cody @Stefan Delphi 的 ShowMessage() 例程确实对 CTRL+C 有特殊处理。
  • 我记得与旧版本的 Visual Foxpro 集成时遇到过类似问题。只有窗体是实际的 Windows 窗口。 Thr 子控件在内部绘制和处理。我认为 VFP 团队中的一些人希望继续创建 Delphi,以便实现它。

标签: c# .net windows winapi messagebox


【解决方案1】:

消息文本位于模式 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);

【讨论】:

  • 如果你在谈论@Jodrell 的消息,他指的是 FoxPro。标准的 Windows MessageBox 有一个静态类类型的窗口,其中包含消息框的文本。 Spy++ 会告诉你这个。正如@Cody 提到的,控制 ID 仍然是 0xFFFF。
  • 是的,我提到了这一点。事实上,本可以自己发布答案。不幸的是,它实际上并没有回答这个问题。有问题的应用程序正在使用的 Delphi 消息框实际上没有标签。忽略关于 FoxPro 的评论,从评论交流开始。
  • @Cody - 我的错。我错过了“显示所有 15 个 cmets”——在我这样做之前从未见过任何提及 Delphi 的内容。我应该删除我的答案吗?
  • 我的意思是,这是你的决定。我只是指出确实有人建议这样做,但不太可能奏效。 cmets 的快速堆积当然无助于人们关注交易所的重要细节。这就是为什么提出一个包含所有重要细节的问题很重要,这样人们就不必从你身上钻出来或假设事情。
【解决方案2】:

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

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

我个人在 Delphi 6 中对此进行了测试,结果如下:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 2011-06-17
    • 2015-01-31
    • 2015-09-04
    相关资源
    最近更新 更多