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

问题描述 投票:0回答:5

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

我搜索过keyboard hooks和winapi,但没有找到合适的使用方法。

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

c# .net winapi hook keyboard-hook
5个回答
2
投票

通过搜索插入符位置很容易,因为它应该大于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

        }
    }

0
投票

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


0
投票

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


0
投票

定义一个

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 的链接。


0
投票

为什么不直接使用 GetCaretPos 函数?

它说:

插入符号位置始终在包含插入符号的窗口的客户端坐标中给出。

如果函数成功,返回值非零。如果函数失败,返回值为零。要获取扩展错误信息,请调用 GetLastError。

© www.soinside.com 2019 - 2024. All rights reserved.