2013-12-23 52 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()); 
      } 
     } 
    }); 
相關問題