我想创建一个在光标下获取单词的应用程序(不仅仅是文本字段),但我不知道如何做到这一点。使用OCR是相当困难的。我唯一看到的工作就是Deskperience组件。他们支持“原生”的方式,但我认为他们的成本很高。现在我正在尝试弄清楚这是什么“原生”的方式(也许是某种钩子)。任何帮助都将不胜感激。
EDIT:我找到了一种方法,但它只获取控件的整个文本。你知道如何从整个文本中只获取光标下的单词吗?
发布于 2011-01-19 18:40:26
在最新版本的视窗中,从一个应用程序收集信息到另一个应用程序(当然,如果您不拥有目标应用程序)的推荐方法是使用UI自动化技术。关于这方面的更多信息,维基百科相当不错:Microsoft UI Automation
基本上,UI自动化将使用所有必要的方法来收集可以收集的内容
这是一个小的控制台应用程序代码,它将侦测其他应用程序的UI。运行它并将鼠标移到不同的应用程序上。每个应用程序对不同的"UI自动化模式“有不同的支持。例如,有值模式和文本模式,如下所示。
static void Main(string[] args)
{
do
{
System.Drawing.Point mouse = System.Windows.Forms.Cursor.Position; // use Windows forms mouse code instead of WPF
AutomationElement element = AutomationElement.FromPoint(new System.Windows.Point(mouse.X, mouse.Y));
if (element == null)
{
// no element under mouse
return;
}
Console.WriteLine("Element at position " + mouse + " is '" + element.Current.Name + "'");
object pattern;
// the "Value" pattern is supported by many application (including IE & FF)
if (element.TryGetCurrentPattern(ValuePattern.Pattern, out pattern))
{
ValuePattern valuePattern = (ValuePattern)pattern;
Console.WriteLine(" Value=" + valuePattern.Current.Value);
}
// the "Text" pattern is supported by some applications (including Notepad)and returns the current selection for example
if (element.TryGetCurrentPattern(TextPattern.Pattern, out pattern))
{
TextPattern textPattern = (TextPattern)pattern;
foreach(TextPatternRange range in textPattern.GetSelection())
{
Console.WriteLine(" SelectionRange=" + range.GetText(-1));
}
}
Thread.Sleep(1000);
Console.WriteLine(); Console.WriteLine();
}
while (true);
}
UI自动化实际上被Internet Explorer和Firefox支持,但据我所知Chrome不支持。请参阅此链接:When will Google Chrome be accessible?
现在,这只是你工作的开始:-),因为:
因此,如果所有这些对你都不起作用,你将不得不深入研究,并使用OCR或形状识别技术。即使这样,也会有一些情况下你根本无法做到这一点(因为安全权限)。
发布于 2011-01-12 17:59:33
如果你想要“窥探”的应用程序本身正在绘制文本,那么这不是一件微不足道的事情。一种可能的解决方案是触发另一个应用程序通过使光标正下方的区域无效来绘制其窗口的一部分。
当另一个应用程序绘制时,您必须拦截文本绘制调用。一种方法是在另一个应用程序中注入代码,并拦截对绘制文本的GDI函数的调用。调试本机应用程序时,这就是visual studio用来实现断点的方法。为了测试这个想法,您可以使用像detours这样的库(但这对于商业用途是不免费的)。
您还可以检查应用程序是否支持Windows中的一种可访问性API,以方便盲人使用屏幕阅读器等功能。
需要注意的是:我自己没有做过任何事情。
发布于 2011-01-12 17:40:21
如果应用程序不仅需要处理.Net应用程序,我会从导入函数(P/Invoke)开始:
稍后,您可以遍历控件,并尝试根据类型从内部获取文本。如果我有时间,我会试着发布这样的代码。
经过一些检查后,它看起来最好的方法(不幸的是也很难)是挂接到GDI文本渲染some discussion中。
https://stackoverflow.com/questions/4665045
复制相似问题