【问题标题】:Virtual keyboard losing focus虚拟键盘失去焦点
【发布时间】:2017-04-26 14:09:57
【问题描述】:

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

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; }
    }

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

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

【问题讨论】:

  • 开始 -> 运行 -> osk.exe。问题已解决,无需代码。
  • 感谢科迪,但这不是解决方案。该应用程序将在嵌入了 Windows 7 的 POS 设备上运行,该设备的键盘没有作为小键盘的数字变体,应客户要求
  • 我的猜测是您将第一个键发送到具有焦点的单元格,但之后您以某种方式获得了焦点。也许您应该检查焦点在哪里,以及谁接收下一个输入...

标签: c# winforms


【解决方案1】:

(评论太长,但可能不足以回答)

我们曾经开发过这样的键盘,我们使用了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 正在通过其驱动程序重新路由输入键,并且在此过程中丢失了一些东西,但从未发现是什么。

【讨论】:

  • 谢谢@Martin。我也使用类似 protected override CreateParams CreateParams { get { CreateParams baseParams = base.CreateParams; const int WS_EX_NOACTIVATE = 0x08000000; const int WS_EX_TOOLWINDOW = 0x00000080; baseParams.ExStyle = (int)(WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW); return baseParams; } } 的东西,但它似乎不起作用。
猜你喜欢
  • 1970-01-01
  • 2011-05-25
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
  • 2022-06-11
相关资源
最近更新 更多