18
  • VS 2010
  • 64 ビット OS で動作する 32 ビット アプリの開発 (Windows 7、Windows 8 - デスクトップ アプリ)
  • C#
  • .NET 4.0
  • Winフォーム

アプリケーションからWindows オンスクリーン キーボード ( osk.exe) を起動する際に多くのスレッドが見つかりましたが、いくつか問題が発生しています。64 ビット OS で 32 ビット アプリを実行しているためと思われます。ここで WooCaSh によって投稿されたコードを試しました: WinForms の画面上のキーボード

しかし、3 つの異なる方法はどれもうまくいきません。sysnativeパスについては、「指定されたパスが見つかりません」Process.Startで失敗し ます。およびパスについては、 「スクリーン キーボードを開始できませんでした」というエラー ダイアログが表示されます。system32osk.exe

ここで可能な回避策を見つけました。これは、探していたものよりも少し複雑です (eryang による投稿): http://social.msdn.microsoft.com/Forums/en-US/netfx64bit/thread/10ebc62f-e6d7 -4072-9fd1-ea3784a0966f/

  1. これを行うためのより簡単または正しい方法はありますか?
  2. タブレットでアプリを実行すると、ユーザーがテキストボックスを選択したときにオンスクリーン キーボードが自動的に起動することを期待していましたが、うまくいきませんでした。これは正常ですか、それとも何か不足していますか? デスクトップモード(私のアプリ)の場合、Windows 8でキーボードが自動的に起動しないことがわかりました:http://www.bleepingcomputer.com/forums/t/480250/keyboard-does-not-pop-up -自動/ Windows 7 タブレットで動作するようですが、ここには Windows 8 タブレットしかないため、テストできません。
4

6 に答える 6

22

「オンスクリーンキーボード」(とにかく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 ビット OS 上の 32 ビット アプリに関係なく、Win7 と Win8 で動作します。ただし、完了時にキーボードをプログラムで閉じるという問題がまだあります。プロセスthis.keyboardProcはハンドルを取得していないようで、すぐにプロパティ を取得しますHasExited = true。これは、それを閉じたり強制終了したりする試みが失敗したことを意味します。

このスレッドによると、ユーザーがキーボードを手動で開いた場合 (またはプログラムで起動した場合)、テキスト フィールドがフォーカスを失ったときにキーボードが自動的に閉じたり非表示になったりすることはありません: Windows 8 - タッチ キーボードを閉じるには? 隠しボタンにフォーカスを合わせる回避策を試したのですが、自分でキーボードを起動したため、自動で閉じません。

于 2013-03-22T17:56:58.490 に答える
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() が機能しません。

于 2013-07-31T09:09:42.920 に答える
2

タッチ キーボードは、UI オートメーションを活用します。理由は不明ですが、標準の Windows エディット ボックスでは UI オートメーションが実装されていませんが、コンボ ボックスなどの他のコントロールでは実装されています。


から UI オートメーションの実装を使用できますUIAutomationClient.dll

UI オートメーションを魔法のようにアプリケーションに挿入するには、アセンブリ内部クラスのクラス初期化子をUiaCoreApiトリガーする必要があります。

たとえば、一見 no-op を呼び出すことで、これを実現できます。

AutomationElement.FromHandle(IntPtr)(-1)

もう 1 つの方法は、自動化 UI を明示的に実装することです。そのために、それぞれの入力コントロールのITextProvider/インターフェイスを実装します。IValueProvider

インターフェイスの実装をコントロールにバインドするには、WM_GETOBJECTウィンドウ メッセージlParam=で処理しますRootObjectId

実装例については、

興味深いことに、タッチ キーボードがすぐに使えるコントロール (コンボ ボックスやパスワード編集ボックスなど、回答を参照) はWM_GETOBJECT/を実装していませんRootObjectId。その背後には別の機械があるに違いありません。


この問題に対する最も一般的な「解決策」は、TabTip.exeまたはを実行してキーボードを明示的にポップアップすることosk.exeですが、ほとんど受け入れられません。

他に何もない場合は、を実行して開いたキーボードを非表示にするクリーンな方法がないためですTabTip.exe(解決策には、プロセスの強制終了やキーの送信などのハックが含まれEscます)。

そして実際には、上記のハックは Windows 10 Anniversary Update では機能しないようです: Show touch keyboard (TabTip.exe) in Windows 10 Anniversary edition .

于 2017-05-25T06:50:37.887 に答える
0

TabTip.exe の起動は、Widnows 10 Anniversary Edition では機能しなくなりました。タッチ キーボードを制御するための文書化されていない COM インターフェイスを発見しました。ここでコードを確認してください https://stackoverflow.com/a/40921638/332528

于 2016-12-01T22:45:23.090 に答える