我在C#中有一个热键窗口应用程序,我希望其他应用程序的焦点窗口中的所有文本都按下热键,如记事本,浏览器,命令窗口(cmd),Turbo c ++,Pascal等。
那有可能吗?
如果有任何想法,请帮我解决代码示例。
我附加了屏幕截图。我想从这个窗口阅读文字。在按热键时,我想阅读文本“这是我的测试文本”。
答案 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)