2017-04-26 110 views
2

我已经创建了一个实现了下面的代码数字键盘自定义表单:虚拟键盘失去焦点

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方法),但在我的应用程序中,在我打算使用它(或其他可编辑控件)的网格单元格中,它无法插入值。 意外地我发现它只能插入一次值,当单元格不处于编辑模式时,但它具有焦点。

从一种形式到另一个虚拟键盘的任何履行例如将高度赞赏

+0

开始 - >运行 - > osk.exe。问题解决了,没有必要的代码。 –

+0

感谢科迪,但这不是一个解决方案。该应用程序将运行在Windows 7嵌入式的POS设备上,键盘没有数字变体作为数字键,客户要求 – AlexSen

+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是通过它的驱动程序重新路由输入键,并在途中丢失了一些东西,但从来没有发现什么。

+0

感谢@马丁。我也使用类似的东西 '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; } }' 但它似乎没有工作。 – AlexSen