2013-12-23 54 views
1

我正在开发Windows 8.1平板电脑的用户界面,该平板电脑上有完整版本的Windows。在Windows 8.1的底部有一个键盘图标,它带来了一个键盘,我希望它在点击一个numericUpDown框后自动触发。然后,我还想在离开或单击盒子后关闭它。在C#中为Windows 8平板电脑启动键盘

我基本上只是试图集中它,当它被点击,但这似乎并没有提起键盘。另外,请注意,我正在设置一些其他numericUpDown框,以便我可以在外部调用它,所以我希望不会很难看到发生了什么,请告诉我,如果您需要任何澄清并感谢你的帮助。这是我到目前为止:

copiedNUD.Click += CopiedNudPass_Focus; 

//copy copied nud 
CopiedNudPass = copiedNUD; 

... 

void CopiedNudPass_Focus(object sender, EventArgs e) 
{ 
    CopiedNudPass.Focus(); 
} 

我试着环顾一下,但一些解决方案对我来说不太清楚。我非常感谢帮助。谢谢。

回答

2

我想通了。这里是我的代码专门针对平板电脑视窗8或更高:

copiedNUD.Click += CopiedNudPass_Focus; 

//copy copied nud 
CopiedNudPass = copiedNUD; 

... 


//Launch keyboard 
void CopiedNudPass_Focus(object sender, EventArgs e) 
{ 

    Version win8version = new Version(6, 2, 9200, 0); 

    if (Environment.OSVersion.Version >= win8version) 
    { 
     string progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink"; 
     string keyboardPath = Path.Combine(progFiles, "TabTip.exe"); 

    Process.Start(keyboardPath); 
    } 
} 

//Close keyboard 
void CopiedNudPass_LostFocus(object sender, EventArgs e) 
{ 

    Version win8version = new Version(6, 2, 9200, 0); 

    if (Environment.OSVersion.Version >= win8version) 
    { 
     Process[] oskProcessArray = Process.GetProcessesByName("TabTip"); 
     foreach (Process onscreenProcess in oskProcessArray) 
     { 
      onscreenProcess.Kill(); 
     } 
    Refresh(); 
    } 
} 

我唯一的问题现在的问题是,当键盘关闭我的背景主要形式被切断,我试了一下使用刷新来刷新( ); ,但是这似乎并没有工作:(

1

这里是一个更好的关闭功能:

After killing the process for TabletKeyboard(TabTip.exe) application doesn't bring back to its original size in wpf

这是我的新的关闭代码:

//Close keyboard 
void CopiedNudPass_LostFocus(object sender, EventArgs e) 
{ 
    Version win8version = new Version(6, 2, 9200, 0); 

     if (Environment.OSVersion.Version >= win8version) 
     { 
      uint WM_SYSCOMMAND = 274; 
      uint SC_CLOSE = 61536; 
      IntPtr KeyboardWnd = FindWindow("IPTip_Main_Window", null); 
      PostMessage(KeyboardWnd.ToInt32(), WM_SYSCOMMAND, (int)SC_CLOSE, 0); 
     } 
} 

我也不得不添加对WindowsBase的引用,并将外部函数添加到项目中,其步骤和附加代码位于本文链接的url中,下面介绍如何添加WindowsBase的引用以使用System.Windows.Interop;工作:

  1. 右键单击项目
  2. 选中添加,然后单击参考
  3. 确保您有以下组件选择框架
  4. 向下滚动并为您在“WindowsBase”,点击OK
  5. 添加使用System.Windows。互操作;在你的代码的顶部和你做
0

这为我工作(在Java中& Eclipse RCP的)

text.addFocusListener(new FocusListener() 
    { 
     @Override 
     public void focusLost(FocusEvent arg0) 
     { 
       LogUtil.logInfo("Closing OSK"); 

       try 
       { 
        if(Settings.getBoolean(Settings.OSK_USETABTIP)) { 
         Runtime.getRuntime().exec("cmd /c taskkill /IM tabtip.exe"); 
        } else { 
         Runtime.getRuntime().exec("cmd /c taskkill /IM osk.exe"); 
        } 
       } 
       catch (IOException e) 
       { 
        LogUtil.logError(e.toString()); 
       } 
     } 

     @Override 
     public void focusGained(FocusEvent arg0) 
     { 
      try 
      { 
       String sysroot = System.getenv("SystemRoot"); 

       if(Settings.getBoolean(Settings.OSK_USETABTIP)) { 
        LogUtil.logInfo("Opening TabTip"); 
        ProcessBuilder pb = new ProcessBuilder("C:/pathtotabtip/tabtip.exe"); 
        pb.start(); 
       } else { 
        LogUtil.logInfo("Opening OSK"); 
        ProcessBuilder pb = new ProcessBuilder(sysroot + "/system32/osk.exe"); 
        pb.start(); 
       } 
      } 
      catch (Exception e) 
      { 
       LogUtil.logError(e.toString()); 
      } 
     } 
    }); 
相关问题