返回

Windows 下获取光标所在单词:无需 OCR 或第三方组件

windows

在 Windows 中获取光标下方的单词:无需 OCR 或昂贵的第三方组件

概述

在开发应用程序时,你可能需要获取光标下方的单词。然而,这并不是一个简单的任务,尤其是在它不只是针对文本字段时。本文将探讨一种本机方法,无需使用 OCR 或昂贵的第三方组件即可获取光标下方的单词。

理解问题

OCR(光学字符识别)是一种复杂且昂贵的方法,用于从图像中提取文本。而市面上现有的解决方案往往价格不菲。因此,需要一种本机方法来解决这个问题。

本机方法

步骤 1:获取控件句柄

要获取控件句柄,可以使用以下代码:

HWND hwnd = WindowFromPoint(GetCursorPos());

步骤 2:获取控件文本

获取控件句柄后,可以使用 SendMessage 函数获取其文本:

int length = SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0);
char* text = new char[length + 1];
SendMessage(hwnd, WM_GETTEXT, length + 1, (LPARAM)text);

步骤 3:确定光标位置

要确定光标在控件文本中的位置,可以使用以下代码:

DWORD pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, MAKELPARAM(GetMessagePos(), 0));

步骤 4:提取单词

有了光标位置,就可以提取单词:

int start = pos;
while (start > 0 && text[start - 1] != ' ')
  start--;
int end = pos;
while (end < length && text[end] != ' ')
  end++;
char* word = new char[end - start + 1];
memcpy(word, text + start, end - start);
word[end - start] = '\0';

代码示例

#include <windows.h>
#include <stdio.h>

int main() {
  HWND hwnd = WindowFromPoint(GetCursorPos());
  int length = SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0);
  char* text = new char[length + 1];
  SendMessage(hwnd, WM_GETTEXT, length + 1, (LPARAM)text);
  DWORD pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, MAKELPARAM(GetMessagePos(), 0));
  int start = pos;
  while (start > 0 && text[start - 1] != ' ')
    start--;
  int end = pos;
  while (end < length && text[end] != ' ')
    end++;
  char* word = new char[end - start + 1];
  memcpy(word, text + start, end - start);
  word[end - start] = '\0';
  printf("The word under the cursor is: %s\n", word);
  return 0;
}

局限性

该方法仅适用于具有文本编辑功能的控件。对于其他类型的控件,可能需要使用不同的方法。

结论

通过本文所述的步骤,你可以获取 Windows 中光标下方的单词,而无需使用 OCR 或昂贵的第三方组件。这对于开发文本处理应用程序或需要从用户界面中提取文本的其他应用程序非常有用。

常见问题解答

1. 该方法是否适用于所有类型的控件?

不,该方法仅适用于具有文本编辑功能的控件。

2. 该方法是否需要使用 OCR?

不,该方法无需使用 OCR 或任何昂贵的第三方组件。

3. 该方法是否适用于 Windows 的所有版本?

该方法适用于 Windows 的大多数版本,包括 Windows XP、7、8、10 和 11。

4. 我可以在哪些应用程序中使用该方法?

你可以将该方法用于开发文本处理应用程序、文本编辑器或需要从用户界面中提取文本的任何其他应用程序。

5. 该方法是否具有任何限制?

该方法仅适用于具有文本编辑功能的控件,并且在某些情况下可能无法正确获取光标下方的单词。