在任何打开的应用程序的文本字段中获取“光标前的单词”的最佳方法

时间:2010-01-15 20:24:08

标签: c# text textbox

我正在编写一个位于系统托盘中的文本输入应用程序,并通过键盘挂钩帮助输入文本。用户输入的当前字符由前面的字母决定。

所以,如果你有“我想要本|” “|”代表插入符号,当用户敲击键盘时,通过对单词的前一个字母“ben”进行计算来确定下一个字母。它可能会变成'd'> “弯曲”或“t”> “弯曲”等等。

如果我从头开始每个单词,这可以正常工作,我可以在我的程序中跟踪字符串中的单词。

当我在一个单词的中间设置插入符时出现问题。我需要检测插入符号位置之前的字符。如果我按箭头键等,也会出现这种情况。

在过去的AutoHotkey应用程序中,我通过发送“Shift + Ctrl +向左箭头”命令突出显示字符,使用“Ctrl + C”命令复制它,然后将剪贴板保存到我的字符串中。我希望在像C#这样更强大的语言中,我可以避免使用这种技术的丑陋突出文物。有没有办法以编程方式获取字符?

请注意,这必须在应用程序的任何文本字段中出现,因此我无法从文本字段本身获取字符(除非有办法访问当前焦点对齐的文本字段)。

您怎么看?

3 个答案:

答案 0 :(得分:3)

因此,使用传统的.NET TextBox,您可以使用SelectionStart属性来判断插入位置。所以我要做的是检测文本何时发生变化并查看插入符号的位置。以下是一些可以适应您情况的快速示例代码:

// first find the caret position
int caretPosition = MyTextBox.SelectionStart;

// now find all text that occurs before the caret
string textUpToCaret = MyTextBox.Text.Substring(0, caretPosition);

// now we can look for the last space character in the
// textUpToCaret to find the word
int lastSpaceIndex = textUpToCaret.LastIndexOf(" ");

if (lastSpaceIndex < 0)
    lastSpaceIndex = 0;

string lettersBeforeCaret = textUpToCaret.Substring(lastSpaceIndex);

答案 1 :(得分:3)

获取“当前文本框”没有万无一失的方法。任何应用程序都可以自行推出,因此您不知道该寻找什么。如果一个应用程序不会在这样的事情上合作,你就不能真正强迫它。好吧,我想你总是可以尝试捕获屏幕截图并尝试对其进行OCR,但这不太现实。

但是,使用质量不错的小部件工具包(或使用库存控件)编写的应用程序应该支持Microsoft Active Accessibility,它提供了访问该应用程序的UI的标准化方法 - 或者更确切地说,是一些抽象视图。该UI,针对屏幕阅读器等工具从中提取信息进行了优化。听起来像你想要的,除了我不知道如何从使用MSAA的控件中检索有关文本前面选项(插入符号只是一个0宽度选择)的信息。

答案 2 :(得分:0)

您很可能必须以编程方式找出正在编辑的文本框的ID,然后发送Windows消息(通过PostMessageSendMessage调用)以检索文本文本域。我忘记了检索文本需要什么消息常量,但有一种方法可以使用Windows API。

可以找到您可以尝试发送到Windows应用的消息的C#枚举here

另外,我建议使用像Spy ++或Winspector spy这样的程序进行调试。