如何知道键盘在文本输入上是否处于活动状态

我有一个像屏幕键盘一样的应用程序,我需要它知道键盘光标(插入符号)是否在任何位置处于活动状态,因此键盘将设置为活动状态。

我搜索了键盘钩子和winapi,但我找不到合适的方法。

为了简化我的问题,如果用户可以按真实键盘并在计算机上打印文本,我需要激活我的应用程序。

通过搜索插入位置很容易,因为它应该大于0

GUITHREADINFO lpgui = new GUITHREADINFO(); IntPtr fore = GetForegroundWindow(); uint tpid = GetWindowThreadProcessId(fore, IntPtr.Zero); lpgui.cbSize = Marshal.SizeOf(lpgui.GetType()); bool flag = GetGUIThreadInfo(tpid, out lpgui); WINDOWINFO pwi = new WINDOWINFO(); pwi.cbSize = (uint)Marshal.SizeOf(pwi.GetType()); GetWindowInfo((IntPtr)lpgui.hwndCaret, ref pwi); if (flag) { if (!(lpgui.rcCaret.Location.X == 0 && lpgui.rcCaret.Location.Y == 0)) { //TODO } } 

稍微解决一下,但如果您可以在您的环境中订阅OnFocusChange事件,那么您可以检查新接收焦点的控件类型。 根据它是否是“可键控”类型(或源自“可键控”类型),您可以显示或隐藏屏幕键盘。

这是一篇关于制作自定义屏幕键盘的MSDN文章: http : //msdn.microsoft.com/en-us/magazine/hh708756.aspx

定义DLLImport以便获取当前关注的窗口句柄:

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

现在,如果键盘有针对性的东西,你可以运行它来获取该窗口句柄:

 public static bool ControlIsFocused() { // To get hold of the focused control: IntPtr focusedHandle = GetFocus(); return focusedHandle != IntPtr.Zero; } 

因此,除非它是允许键盘焦点的控件,否则此方法应返回IntPtr.Zero

这是Windows API的链接。