如何从第三方应用的Textbox中获取文本?Window Inspector/Spy++
提取第三方Edit控件文本的方法
你已经通过Window Inspector和Spy++拿到了目标Edit控件的句柄0x00010660,可以用Windows原生API直接提取文本,以下是具体实现方式:
方法一:C++ 实现
利用GetWindowTextLengthW获取文本长度,再用GetWindowTextW读取内容:
#include <windows.h> #include <iostream> #include <wstring> int main() { HWND hEdit = (HWND)0x00010660; // 你的目标控件句柄 if (!IsWindow(hEdit)) { std::cout << "无效的控件句柄" << std::endl; return 1; } // 获取文本长度(含结束符) int length = GetWindowTextLengthW(hEdit); if (length == 0) { std::cout << "控件无内容或读取失败" << std::endl; return 0; } // 分配内存存储文本 std::wstring text(length, L'\0'); GetWindowTextW(hEdit, text.data(), length + 1); // 输出结果 std::wcout << L"提取到的文本:" << text << std::endl; return 0; }
编译时需要链接user32.lib。
方法二:PowerShell 脚本
用PowerShell调用Windows API,适合快速测试:
Add-Type @" using System; using System.Runtime.InteropServices; public class Win32 { [DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern int GetWindowTextLength(IntPtr hWnd); [DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); } "@ $hEdit = [IntPtr]0x00010660 $length = [Win32]::GetWindowTextLength($hEdit) if ($length -eq 0) { Write-Host "控件无内容或读取失败" exit } $sb = New-Object System.Text.StringBuilder ($length + 1) [Win32]::GetWindowText($hEdit, $sb, $length + 1) Write-Host "提取到的文本:" $sb.ToString()
注意事项
- 确保程序以相同或更高权限运行(如果目标应用是管理员权限,你的提取工具也要管理员权限)
- 上述方法仅对标准Windows Edit控件有效,如果目标控件是自定义的(比如用Qt、WPF等框架实现的非原生Edit),可能需要用UI自动化(UIA)的方式提取,比如用
UIAutomationClient库 - 控件句柄可能会随应用重启变化,实际使用时建议通过窗口类名、标题等动态查找,而不是硬编码句柄
内容的提问来源于stack exchange,提问作者Rafael Ventura
相关产品推荐
相关产品推荐

