得到窗口的描述符

时间:2012-02-14 18:53:20

标签: c# c++ winapi

  

可能重复:
  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"));
        }

3 个答案:

答案 0 :(得分:2)

对于它的价值,这很可能是编写虚拟键盘的错误方法;你最好使用SendInput来注入击键,并让Windows / USER32处理将输入路由到当前聚焦窗口本身 - 这样你甚至不需要知道当前聚焦窗口第一名。

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

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

答案 1 :(得分:0)

HWND WINAPI GetForegroundWindow(void);

检索前台窗口的句柄(用户当前正在使用的窗口)。系统为创建前台窗口的线程分配的优先级略高于其他线程的优先级。

HWND WINAPI GetActiveWindow(void);

检索附加到调用线程的消息队列的活动窗口的窗口句柄。

其中一个可能会这样做。

答案 2 :(得分:0)

如果你想要一个更复杂的例子,你也可以看看这个

请参阅示例,了解如何使用完整源代码执行此操作:

http://www.csharphelp.com/2006/08/get-current-window-handle-and-caption-with-windows-api-in-c/

[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll")]
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

private string GetActiveWindowTitle()
{
    const int nChars = 256;
    IntPtr handle = IntPtr.Zero;
    StringBuilder Buff = new StringBuilder(nChars);
    handle = GetForegroundWindow();

    if (GetWindowText(handle, Buff, nChars) > 0)
    {
        return Buff.ToString();
    }
    return null;
}