从另一个应用程序的窗口中的文本字段读取
Windows应用程序是否可以访问其他应用程序数据(更具体地说是GUI中的文本输入字段),然后获取文本以便在我们自己的应用程序中处理?从另一个应用程序的窗口中的文本字段读取
如果有可能,有没有办法“屏蔽”你的应用程序来防止它?
编辑:三个第一个答案似乎是获得另一个应用程序窗口标题,而不是该窗口中的特定文本输入字段。
我不是Windows API的预期,所以你可以更准确地如何找到该窗口中的某个文本字段,它有什么先决条件(好像知道一个窗口句柄是必需的,是否需要知道文本字段句柄以及如何得到那个?等等......)
C++中的代码片段真的很值得赞赏。 MSDN帮助很难浏览,因为Win32-API具有这样可怕的命名约定。
已完成!请参阅下面的答案,了解C++中的操作方法。
对于从另一个应用程序的文本框中读取文本内容,您需要以某种方式获取该文本框控件的窗口句柄。根据应用程序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);
我用“间谍++”来获得句柄文本框窗口,正好是躺在附近。
至于保护你自己的文本框不被这样检查,你总是可以对你的文本框进行分类(参见“SetWindowLong”和“GWL_WNDPROC”中的“nIndex”参数),并对“ WM_GETTEXT“消息来确保只有来自同一进程的请求被服务。
是的,它有很多可能的方法(一种方法是使用WINAPI GetWindow和GetWindowText)。
首先,得到一个处理你想要从(使用FindWindow API,EnumChildWindows和其他API)文本的文本框,然后:
旧VB6-codeexample,API的声明:
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
代码中提取文本:
Dim MyStr As String
MyStr = String(GetWindowTextLength(TextBoxHandle) + 1, Chr$(0))
GetWindowText TextBoxHandle, MyStr, Len(MyStr)
MsgBox MyStr
HWND FindWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName
);
关于如何屏蔽应用程序以防止它,你可以做很多事情。 其中一种方法是拥有一个自己的控件来处理文本输入,这些文本输入可以让文本放置在文本所在的位置,或者以图形方式绘制文本。
好的,我有点想通了。现在
的出发点是知道的窗口句柄确切地说,我们只知道部分窗口标题,所以首先要做的就是发现,主窗口:
...
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和小正则表达式魔术,我们可以找到我们想要的窗口。
通过使用之前提到的间谍++我能想出的文本编辑字段的类名,并用它来查找hwndWindow通缉领域:
hwndEdit = FindWindowEx(hwndWindow, NULL, L"RichEdit20W", NULL);
,然后我们可以读取该字段中的文本:
result = SendMessage(hwndEdit, WM_GETTEXT, (WPARAM) 4096, (LPARAM) wsText);
我希望这可以帮助任何人解决同一个问题!
什么是wsText?你可以发布你的来源?谢谢。 – 2014-01-16 05:58:36
这是chararray,与回调代码中的`TCHAR wsTitle [2048];`相同。来源已经丢失,对不起。 – Tuminoid 2014-01-16 08:52:30
您还可以使用EM_GETTEXTRANGE消息从RichEdit控件获取文本,但它仅在与创建控件相同的过程中起作用。
我不知道要在来源中搜索什么,给我一个指针? – Tuminoid 2008-12-09 09:58:55