2013-03-21 62 views
11
  • VS 2010
  • 開發32位應用程序在64位操作系統上運行(Win7的,Win8的 - 桌面應用程序)
  • C#
  • .NET 4.0
  • 的WinForms

我發現關於開展從一個應用程序在Windows上的屏幕鍵盤(osk.exe)多線程,但我遇到了一些問題。這似乎是因爲我在64位操作系統上運行32位應用程序。我試過WooCaSh在這裏發佈的代碼: Keyboard on the screen in WinForms如何在C#的WinForms使用Windows屏幕鍵盤

但是三種不同的路徑都不適用於我。對於「系統性」路徑,Process.Start「找不到指定的路徑」。對於system32和osk.exe路徑,我收到「無法啓動屏幕鍵盤」錯誤對話框。

我發現了一個可能的解決方法在這裏,這是一個小比更復雜的東西我一直在尋找(由eryang後):http://social.msdn.microsoft.com/Forums/en-US/netfx64bit/thread/10ebc62f-e6d7-4072-9fd1-ea3784a0966f/

  1. 是否有更簡單的或正確的方式做到這一點?
  2. 我曾希望在平板電腦上運行我的應用程序會在用戶選擇文本框時自動啓動屏幕鍵盤,但沒有運氣。這是正常的還是我錯過了什麼? 編輯:發現鍵盤在桌面模式下(我的應用程序是)在Win8下不會自動啓動:http://www.bleepingcomputer.com/forums/t/480250/keyboard-does-not-pop-up-automatically/顯然它適用於Win7平板電腦,但我無法測試,因爲我只有Win8平板電腦。
+0

只需將您的EXE項目上的平臺目標設置更改爲「AnyCPU」即可。 – 2013-03-21 18:53:06

+0

不幸的是,它需要與x86交互的某些第三方軟件。 – Tara 2013-03-21 18:54:33

+0

只是爲了測試,我繼續前進並更改爲「AnyCPU」。鍵盤仍然不會在我的Win7 64位桌面上啓動,而是在Win8 64位平板電腦上啓動。有任何想法嗎? – Tara 2013-03-21 19:00:08

回答

18

我現在推出的「觸摸鍵盤」,而不是在「屏幕鍵盤」(這是我想在Windows 8鍵盤反正):

string progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink"; 
string keyboardPath = Path.Combine(progFiles, "TabTip.exe"); 

this.keyboardProc = Process.Start(keyboardPath); 

這工作對我無論我在64位操作系統上使用32位應用程序,Win7和Win8。但是,當我完成後,仍然存在編程式關閉鍵盤的問題。進程this.keyboardProc似乎沒有得到句柄,並立即擁有HasExited = true屬性。這意味着我關閉或殺死它的嘗試失敗。

根據此線程,如果用戶手動打開鍵盤(或以編程方式啓動鍵盤),則當文本字段失去焦點時,鍵盤將不會自動關閉/隱藏:Windows 8 - How to Dismiss Touch Keyboard?我嘗試了將焦點設置爲隱藏按鈕,但由於我自己啓動了鍵盤,它不會自動關閉。

+3

偉大的工作!我浪費了至少一小時這個廢話。你的解決方案幫助我。 – bump 2014-06-03 14:25:58

+0

也適用於Windows 10平板電腦。沒有什麼比保持恐龍活着... – brady321 2016-01-22 13:54:39

+0

請注意,您可能沒有安裝「Tablet PC組件」窗口功能...如果沒有轉到控制面板,程序並關閉或關閉Windows功能 – Barry 2016-02-08 08:21:48

12

我無法關閉屏幕鍵盤。你可以用

 string progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink"; 
     string onScreenKeyboardPath = System.IO.Path.Combine(progFiles, "TabTip.exe"); 
     onScreenKeyboardProc = System.Diagnostics.Process.Start(onScreenKeyboardPath); 

啓動觸摸式鍵盤,並與

  //Kill all on screen keyboards 
      Process[] oskProcessArray = Process.GetProcessesByName("TabTip"); 
      foreach (Process onscreenProcess in oskProcessArray) 
      { 
       onscreenProcess.Kill(); 
      } 

關閉所有鍵盤出於某種原因onScreenKeyboardProc.Kill()或.Close()不工作。

+0

IT能正常工作:/ – IMAK 2015-06-23 18:54:53

4

要使鍵盤自動打開,控件必須實現一些UI自動化控件模式,特別是ITextProvider/IValueProvider。這是一個麻煩事,但它的工作原理(這是不是啓動一些的* .exe一個更清潔的方式)

我寫了一個示例應用程序和短文章在這裏:http://blog.tombam.net/implementing-textbox-with-on-screen-touch-keyboard-part-1/

+0

奇妙的文章!你有沒有發現強制數字鍵盤的方法? – 2017-12-28 17:00:26

1

觸摸鍵盤充分利用了UI自動化。由於某些對我來說很神祕的原因,標準的Windows編輯框不會自動實現UI,而其他控件(如組合框)則可以。


可以使用從UIAutomationClient.dll實現UI自動化。

爲了將UI自動化神奇地注入到應用程序中,必須觸發程序集內部類UiaCoreApi的類初始值設定項。

在可以通過調用看似無操作實現這一目標,例如:

AutomationElement.FromHandle(IntPtr)(-1) 

另一種方式是明確實現自動化UI。爲了實現相應輸入控制的接口,可以使用ITextProvider/IValueProvider接口。

要將接口的實現綁定到控件,請使用lParam = RootObjectId處理WM_GETOBJECT window message

對於實現的示例,參見

但有趣的是,控制,爲此,觸摸式鍵盤工作外的開箱(如組合框或密碼編輯框,一看便知),不執行WM_GETOBJECT/RootObjectId。他們身後必須有不同的機器。


最常見的「解決方案」這一問題,通過運行TabTip.exeosk.exe明確彈出鍵盤,是難以接受的。

如果不出意外的話,因爲沒有乾淨的方法來隱藏運行TabTip.exe(解決方案包括像殺死進程或發送Esc鍵鍵黑客)打開鍵盤。

實際上,上述黑客在Windows 10週年更新中似乎不再適用:Show touch keyboard (TabTip.exe) in Windows 10 Anniversary edition