当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《从另一个应用程序窗口中的文本字段读取》经验,为你挑选了2个好方法。

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

如果有可能,有没有办法"屏蔽"您的应用程序以防止它?

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

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

C++中的代码片段确实非常值得赞赏.MSDN帮助很难浏览,因为Win32-API有如此可怕的命名约定.

已完成!请参阅下面的答案,了解C++中的操作方法.



1> Raj..:

要从另一个应用程序的文本框中读取文本内容,您需要以某种方式获取该文本框控件的窗口句柄.根据应用程序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 ++"来获取正好位于文本框窗口的句柄.

至于保护自己的文本框不被这样检查,你总是可以对文本框进行子类化(对于"nIndex"参数,请参阅"SetWindowLong"和"GWL_WNDPROC")并对"WM_GETTEXT"消息进行一些特殊处理.确保只处理来自同一进程的请求.



2> Tuminoid..:

好的,我有点想通了.

现在的起点是确切地知道窗口句柄,我们只知道部分窗口标题,所以首先要做的是找到主窗口:

...
EnumWindows((WNDENUMPROC)on_enumwindow_cb, 0);
...

它通过桌面上的所有窗口进行枚举.它使用每个窗口句柄进行回调:

BOOL CALLBACK on_enumwindow_cb(HWND hwndWindow, LPARAM lParam) {
    TCHAR wsTitle[2048];
    LRESULT result;
result = SendMessage(hwndWindow, WM_GETTEXT, (WPARAM) 2048, (LPARAM) wsTitle);
    ...

通过使用wsTitle和小正则表达式魔法,我们可以找到我们想要的窗口.

通过使用前面提到的Spy ++,我可以找出文本编辑字段类名,并使用它在hwndWindow中查找所需字段:

hwndEdit = FindWindowEx(hwndWindow, NULL, L"RichEdit20W", NULL);

然后我们可以从该字段中读取文本:

result = SendMessage(hwndEdit, WM_GETTEXT, (WPARAM) 4096, (LPARAM) wsText);

我希望这可以帮助任何人解决同样的问题!

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有