从另一个应用程序窗口中的文本字段读取

新手上路,请多包涵

Windows 应用程序有没有办法访问另一个应用程序的数据,更具体地说是 GUI 中的文本输入字段,并在那里获取文本以便在我们自己的应用程序中处理?

如果可能的话,有没有办法“屏蔽”你的应用程序来防止它?


编辑: 前三个答案似乎是关于获取另一个应用程序窗口标题,而不是该窗口中的特定文本输入字段。

我不是 Windows API 专家,所以你能否更准确地说我如何在该窗口中找到某个文本字段,它的先决条件是什么(似乎知道窗口句柄是必需的,是否需要知道文本字段也处理?我怎么得到那个?等等……)

C++ 中的代码片段真的会非常感激。 MSDN 帮助很难浏览,因为 Win32-API 有如此可怕的命名约定。


完全的! 有关 C++ 的操作方法,请参阅下面的答案。

原文由 Tuminoid 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

要从另一个应用程序的文本框中读取文本内容,您需要以某种方式获取该文本框控件的窗口句柄。根据您的应用程序 UI 的设计方式(如果它有一个 UI),您可以使用几种不同的方法来获取此句柄。您可以使用“FindWindow”/“FindWindowEx”来定位您的控件,或者在有意义的情况下使用“WindowFromPoint”。无论哪种方式,一旦你有了文本控件的句柄,你就可以向它发送一个“WM_GETTEXT”消息来检索它的内容(假设它是一个标准的文本框控件)。这是一个编造的样本(没有错误检查):

 HWND hwnd = (HWND)0x00310E3A;
char szBuf[2048];
LONG lResult;

lResult = SendMessage( hwnd, WM_GETTEXT, sizeof( szBuf ) / sizeof( szBuf[0] ), (LPARAM)szBuf );
printf( "Copied %d characters.  Contents: %s\n", lResult, szBuf );

我使用“Spy++”来获取一个文本框窗口的句柄,该窗口恰好在附近。

至于保护您自己的文本框不被这样检查,您始终可以对您的文本框进行子类化(参见“SetWindowLong”和“GWL_WNDPROC”以获得“nIndex”参数)并对“WM_GETTEXT”消息进行一些特殊处理以确保只处理来自同一进程的请求。

原文由 Raj 发布,翻译遵循 CC BY-SA 2.5 许可协议

看看 AutoHotkey 。如果您的应用程序需要 API,请查看其来源。为防止出现这种情况,请使用自定义小部件而不是 WinForms、MFC 或 Win32 API。这不是万无一失的,但有帮助。

原文由 MZywitza 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题