我有一个像屏幕键盘一样的应用程序,我需要它知道是否有键盘光标(插入符号)在任何地方处于活动状态,因此键盘将设置为活动状态。
我已经搜索了键盘挂钩和 winapi,但找不到正确的使用方法。
为了简化我的问题,如果用户可以按下真实键盘并在计算机上打印文本,我需要激活我的应用程序。
我有一个像屏幕键盘一样的应用程序,我需要它知道是否有键盘光标(插入符号)在任何地方处于活动状态,因此键盘将设置为活动状态。
我已经搜索了键盘挂钩和 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
}
}
定义一个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的链接。
一种解决方法,但如果您可以在您的环境中订阅 OnFocusChange 事件,那么您可以检查新获得焦点的控件类型。根据它是否为“可键盘输入”类型(或派生自“可键盘输入”类型),您可以显示或隐藏屏幕键盘。
这是关于制作自定义屏幕键盘的 MSDN 文章:http: //msdn.microsoft.com/en-us/magazine/hh708756.aspx