c# - 获取窗口的描述符

标签 c# c++ winapi

<分区>

Possible Duplicate:
Create an On-screen Keyboard

我正在尝试编写一个虚拟键盘。你能告诉我如何获得聚焦窗口的描述符 hWnd 吗? (它可以用于 Word、Excel、Skype 等)

我正在使用 findWindow(),但为此我必须知道窗口的名称。

IntPtr hWnd = FindWindow("Notepad", null);

        if (!hWnd.Equals(IntPtr.Zero))
        {
            MessageBox.Show("Tagil");
            IntPtr edithWnd = FindWindowEx(hWnd, IntPtr.Zero, "Edit", null);
            if (!edithWnd.Equals(IntPtr.Zero))
                SendMessage(hWnd, WM_SETTEXT, IntPtr.Zero, new StringBuilder("Hello World"));
        }

最佳答案

就其值(value)而言,这很可能是编写虚拟键盘的错误方法;你最好使用 SendInput注入(inject)击键,并让 Windows/USER32 处理将输入路由到当前聚焦窗口本身 - 这样您甚至不需要首先知道当前聚焦窗口。

一个问题是,虽然 Edit/Richedit 控件将使用 WM_SETTEXT,但许多其他现实世界的可编辑控件(如 Word、Excel 等)不会。此外,您不能使用 WM_SETTEXT 发送箭头键或其他非文本内容。

如果你真的还需要找到当前聚焦的HWND,你可以使用GetGUIThreadInfo ,为 idThread 传递 0,然后使用返回的 GUITHREADINFO 结构的 hwndFocus 成员。

关于c# - 获取窗口的描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9282514/

相关文章:

windows - 是否可以将非控制台 Win32 应用程序附加到调用 cmd shell?

c# - 无法在不同机器上运行Appium

c# - MVC3 : How to check recaptcha with Ajax or directly with JS?

c# - 从 TLB 程序集创建 DLL

c++ - 开始使用 openNi 的问题

c++ - 重新使用或清理多维 vector

c++ - 获取可执行文件的服务路径

c# - 将图像嵌入到自己的文件中

c++ - 无法访问 vector 中的整数

c++ - 是否有函数/WinAPI 以不区分大小写的语言方式判断一个字符串是否以另一个字符串开头?