虚拟键盘失去焦点

时间:2017-04-26 14:09:57

标签: c# winforms

我为数字键盘创建了一个自定义表单,它实现了以下代码:

private void btn1_Click(object sender, EventArgs e)
    {
        PressKey(Keys.D1);
    }

    [DllImport("user32.dll", SetLastError = true)]
    static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);

    public static void PressKey(Keys key)
    {
        const int KEYEVENTF_EXTENDEDKEY = 0x1;

        keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0);
    }

我还使用了以下块

protected override bool ShowWithoutActivation
    {
        get { return true; }
    }

它作为记事本,单词或其他编辑器(以及使用基本的SendKeys方法)的魅力,但在我的应用程序中,在我打算使用它(或其他可编辑控件)的网格单元格中,它无法插入值。 我意外地发现,当单元格不处于编辑模式但它具有焦点时,它只能插入一次值。

从一种形式到另一种形式的虚拟键盘实现的任何示例都将受到高度赞赏

1 个答案:

答案 0 :(得分:0)

(评论太长了,但答案可能还不够)

我们曾经开发过这样一个键盘,我们使用了SendKeys class from the .Net Framework(它只是SendInput Win32 API call的包装器。)

键盘形式覆盖了Property CreateParams,因此我们可以明确告诉它不要拍摄焦点(或键发送到键盘形式......)

protected override CreateParams CreateParams
{
    get
    {
        var CreateParams cp = base.CreateParams;
        cp.ExStyle = cp.ExStyle | WS_EX_NOACTIVATE;
        return cp;
    }
}

注意:我们注意到某些程序(如Ultra VNC(用于远程控制))会妨碍正确使用键盘。我想UltraVNC正在通过它的驱动程序重新路由输入键,并且在此过程中丢失了一些东西,但从未发现过什么。