web-dev-qa-db-ja.com

C#WinFormsでWindowsオンスクリーンキーボードを使用する方法

  • VS 2010
  • 64ビットOSで実行される32ビットアプリの開発(Windows 7、Windows 8-デスクトップアプリ)
  • C#
  • .NET 4.0
  • WinForms

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 /

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

「オンスクリーンキーボード」(とにかく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-タッチキーボードを閉じる方法? フォーカスを非表示ボタンに設定する回避策を試しましたが、キーボードを自分で起動したため、自動的に閉じません。

20
Tara

画面キーボードを閉じるのに問題がありました。タッチキーボードを起動するには

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()が機能しません。

10

キーボードを自動的に開くには、コントロールにいくつかのUIオートメーションコントロールパターン、特にITextProvider/IValueProviderを実装する必要があります。これは迷惑ですが、動作します(そして、*。exeを起動するよりもクリーンな方法です)

サンプルアプリと短い記事をここに書いた: http://blog.tombam.net/implementing-textbox-with-on-screen-touch-keyboard-part-1/

7
tombam

タッチキーボードは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)を表示

2
Martin Prikryl

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

0
torvin