Windowsのスクリーンキーボード(osk.exe
)アプリケーションからですが、いくつかの問題に直面しています。 64ビットOSで32ビットアプリを実行しているためと思われます。ここでWooCaShが投稿したコードを試しました: WinFormsの画面上のキーボード
しかし、3つの異なるパスのいずれも私には機能しません。 sysnative
パスの場合、Process.Start
が失敗し、 "指定されたパスが見つかりません。"system32
およびosk.exe
パス、「スクリーンキーボードを起動できませんでした」エラーダイアログが表示されます。
私はここで可能な回避策を見つけましたが、私が探していたものよりも少し複雑です(eryangによる投稿): http://social.msdn.Microsoft.com/Forums/en-US/netfx64bit/thread/10ebc62f-e6d7-4072-9fd1-ea3784a0966f /
「オンスクリーンキーボード」(とにかく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-タッチキーボードを閉じる方法? フォーカスを非表示ボタンに設定する回避策を試しましたが、キーボードを自分で起動したため、自動的に閉じません。
画面キーボードを閉じるのに問題がありました。タッチキーボードを起動するには
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()が機能しません。
キーボードを自動的に開くには、コントロールにいくつかのUIオートメーションコントロールパターン、特にITextProvider/IValueProviderを実装する必要があります。これは迷惑ですが、動作します(そして、*。exeを起動するよりもクリーンな方法です)
サンプルアプリと短い記事をここに書いた: http://blog.tombam.net/implementing-textbox-with-on-screen-touch-keyboard-part-1/
タッチキーボードはUIオートメーションを活用します。私には謎のいくつかの理由で、標準のWindows編集ボックスにはUI自動が実装されていませんが、コンボボックスなどの他のコントロールには実装されています。
UIAutomationClient.dll
からUIオートメーションの実装を使用できます。
UIオートメーションをアプリケーションに魔法のように挿入するには、アセンブリ内部クラスUiaCoreApi
のクラス初期化子をトリガーする必要があります。
Onは、例えば、no-opのように見えることでそれを達成できます:
AutomationElement.FromHandle(IntPtr)(-1)
別の方法は、オートメーションUIを明示的に実装することです。そのためには、それぞれの入力コントロールに ITextProvider
/ IValueProvider
インターフェースを実装します。
インターフェイスの実装をコントロールにバインドするには、 WM_GETOBJECT
ウィンドウメッセージ をlParam
= RootObjectId
で処理します。
実装例については、を参照してください
興味深いことに、タッチキーボードがそのまま使用できるコントロール(コンボボックスやパスワード編集ボックスなど、回答を参照)は、WM_GETOBJECT
/RootObjectId
を実装しません。それらの背後には異なる機械がなければなりません。
TabTip.exe
またはosk.exe
を実行してキーボードを明示的にポップアップするこの問題の最も一般的な「解決策」は、ほとんど受け入れられません。
それ以外の場合は、TabTip.exe
を実行して開いたキーボードを非表示にする明確な方法がないためです(ソリューションには、プロセスの強制終了や送信などのハックが含まれます Esc キー)。
そして実際、上記のハックはWindows 10 Anniversary Updateではもう機能しないようです。 Windows 10 Anniversaryエディションでタッチキーボード(TabTip.exe)を表示 。
TabTip.exeの起動は、Widnows 10 Anniversary Editionでは機能しなくなりました。タッチキーボードを制御するための文書化されていないCOMインターフェイスを発見しました。ここでコードを確認してください https://stackoverflow.com/a/40921638/332528