在C#中从外部应用程序获取UI文本

时间:2020-03-05 18:41:15  来源:igfitidea点击:

是否有可能从C#中的外部应用程序获取UI文本。

特别是,是否有一种方法可以从由第三方编写的外部Win32应用程序从标签(我认为它是普通的Windows标签控件)中读取Unicode文本?文本是可见的,但在UI中无法通过鼠标选择。

我假设有一些可访问性API(例如,供屏幕阅读器使用)允许该操作。

编辑:目前正在研究使用诸如Managed Spy App之类的东西,但仍然会感激其他线索。

解决方案

回答

如果该unicode文本实际上是带有标题的窗口,则可以执行此操作,方法是发送WM_GETTEXT消息。

[DllImport("user32.dll")]
public static extern int SendMessage (IntPtr hWnd, int msg, int Param, System.Text.StringBuilder text);

System.Text.StringBuilder text = new System.Text.StringBuilder(255) ;  // or length from call with GETTEXTLENGTH
int RetVal = Win32.SendMessage( hWnd , WM_GETTEXT, text.Capacity, text);

如果只是将其绘制在画布上,那么如果我们知道应用程序使用的框架,则可能会有些运气。如果它使用WinForms或者Borland的VCL,则可以使用该知识来获得文本。

回答

在该文章中没有看到wm_gettext或者wm_gettextlength的值,以防万一。

const int WM_GETTEXT = 0x0D;
const int WM_GETTEXTLENGTH = 0x0E;