我正在尝试编写虚拟键盘。你能告诉我如何获得焦点窗口的描述符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"));
}
答案 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;
}