从外部应用程序读取所有文本

时间:2014-02-20 11:17:45

标签: c# .net winapi

我在C#中有一个热键窗口应用程序,我希望其他应用程序的焦点窗口中的所有文本都按下热键,如记事本,浏览器,命令窗口(cmd),Turbo c ++,Pascal等。

那有可能吗?

如果有任何想法,请帮我解决代码示例。

我附加了屏幕截图。我想从这个窗口阅读文字。在按热键时,我想阅读文本“这是我的测试文本”。

enter image description here

3 个答案:

答案 0 :(得分:1)

user32 API中有GetWindowText(), 但是如果你需要从另一个进程中的控件获取文本,GetWindowText()将无效。

您必须使用SendMessage()代替WM_GETTEXT:

const UInt32 WM_GETTEXT = 0x000D;
const UInt32 WM_GETTEXTLENGTH = 0x000E;

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, StringBuilder lParam);


static string GetWindowTextRaw(IntPtr hwnd)
{
    // Allocate string length 
    int length = (int)SendMessage(hwnd, WM_GETTEXTLENGTH, IntPtr.Zero, IntPtr.Zero);
    StringBuilder sb = new StringBuilder(length + 1);
    // Get window text
    SendMessage(hwnd, WM_GETTEXT, (IntPtr)sb.Capacity, sb);
    return sb.ToString();
}

答案 1 :(得分:1)

自称为“屏幕阅读器”的应用程序(适用于视障人士)可以做这类事情。

他们使用旧的MSSA(Microsoft Active Accessibility)API和/或新的UIAutomation API。

使用这两个API,如果您有一个“主窗口”HWND,则可以浏览制作该应用程序的组件树。然后,您可以检索属性,例如“文本”或“名称”等。

如果应用程序不支持Accessive技术,那么您将依赖于个案解决方案,这意味着最终可怕的黑客攻击(作为API挂钩)或更常规的方法(作为DLL注入和JAVA中JNI调用API的使用)情况)。

答案 2 :(得分:0)

通过C#,

无法直接实现

Still microsoft提供WMI服务,可用于获取有关机器和进程的最大信息。请检查MSDN

您可以从here下载WMI工具并检查Win32类和方法,您可以找到符合要求的有用信息