Windows 10で タブレットモード でWinForms(またはDelphi、最後に参照)アプリケーションを実行すると、入力ボックスにフォーカスがあるときにタッチキーボードが自動的にポップアップしません。
追加のコード/セットアップなしで、これは自動的に行われるはずだと思います。
テストのために、単一の TextBox
control を持つ最も単純なVS 2015 WinFormsデスクトップアプリケーションがあります。
これは、単にVisual Studioで作成されたデフォルトのWindowsフォームアプリケーションC#プロジェクトです。コードは追加されず、プロパティは変更されません。 Toolboxからドロップすることにより、TextBox
のみが追加されました(プロパティは変更されません):
this.textBox1 = new System.Windows.Forms.TextBox();
this.textBox1.Location = new System.Drawing.Point(64, 27);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(100, 20);
this.textBox1.TabIndex = 0;
ポップアップが自動であるべきという私の仮定を検証するには:
Windows XPバージョンのnotepad.exe
をWindows 10で実行しようとしました。タッチキーボードが自動的にポップアップ表示されます。 Windows XPがタッチキーボードを明示的にサポートしていたとは思えません。
また、いくつかの古代のMFCアプリケーション(たとえば、2005年のFileZilla 2.2.15)も試しました。また、すべての入力ボックスにタッチキーボードがポップアップ表示されます。繰り返しますが、MFCもタッチキーボードを明示的にサポートしていません。
WxWidgetsで構築されたアプリケーション(FileZilla 3.xなど)でも同じです。
WinFormsで自動ポップアップを妨げる何かが壊れているようです。興味深いことに、自動ポップアップは機能します:
ComboBox
with DropDownStyle = DropDown
)TextBox.PasswordChar
)RichTextBox
)TabTip.exe
を実行して、明示的なポップアップに関するすべてのヒントを見てきました。例えば。:
ほとんどの「ソリューション」は、次のようなコードを提供します。
var progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink";
var keyboardPath = Path.Combine(progFiles, "TabTip.exe");
this.keyboardProc = Process.Start(keyboardPath);
しかし、これが「公式」な方法であるとは信じられません。それ以外の場合は、TabTip.exe
を実行して開いたキーボードを非表示にする明確な方法がないためです(ソリューションには、プロセスの強制終了や送信などのハックが含まれます Esc キー)。
実際、上記のハックはWindows 10 Anniversary Updateで機能しなくなったようです。
興味深いことに、Delphi/C++ Builder/VCLアプリケーションでも同じ動作が見られます。編集ボックスのキーボードはポップアップしません( TEdit
)。コンボボックス( TComboBox
)およびパスワードモードの編集ボックス( PasswordChar
)に対してポップアップします。興味深いことに TRichEdit
ではありません。NETRichTextBox
との顕著な違いは、調査する価値があるかもしれません。
この(未回答の)質問は、同一の動作を説明しています。
Windows 10で編集ボックスキーボードにDelphi XE8タッチと書かれたアプリケーションが表示されない 。
Ofek Shilonの答え で示唆されているように、タッチキーボードは Iオートメーション を活用できるようです。
UIAutomationClient.dll
からUIオートメーションの実装を使用できます。
UIオートメーションをアプリケーションに魔法のように注入するには、Assembly内部クラスUiaCoreApi
のクラス初期化子をトリガーする必要があります。
Onは、たとえば、no-opのように見えることでそれを実現できます。
AutomationElement.FromHandle(IntPtr)(-1)
別の方法は、オートメーションUIを明示的に実装することです。そのためには、それぞれの入力コントロールに ITextProvider
/ IValueProvider
インターフェースを実装します。
インターフェイスの実装をコントロールにバインドするには、 WM_GETOBJECT
ウィンドウメッセージ をlParam
= RootObjectId
で処理します。
実装例については、を参照してください
興味深いことに、タッチキーボードがそのまま使用できるコントロール(コンボボックスやパスワード編集ボックスなど、回答を参照)は、WM_GETOBJECT
/RootObjectId
を実装しません。それらの背後には異なる機械がなければなりません。
根本的な原因は、WinformsのtextBoxがAutomationElementではなく、言及されているその他のコントロール(ComboBoxesなど)がそうであるようです。
Markus von und zu Heberの引用 ここで受け入れられた答え :
記事「 Windows 8+上のWPFアプリケーションのTextBoxの自動タッチキーボード 」で発見しましたが、winformでも非常に優れた(そしてさらに簡単に!)動作します。ありがとう、ドミトリー・リアリン!
UIAutomationClient.dllへの参照をプロジェクトに挿入します
アプリケーションのメインウィンドウのform-load-handlerに、次のコードを挿入します。
var asForm = System.Windows.Automation.AutomationElement.FromHandle(this.Handle);
私はこの道を何回か行ってきましたが、taptip.exe
オプション。次に、プロセスを強制終了してウィンドウを閉じます。また、一部のレジストリハックを使用すると、キーボードをデフォルトで手書きパネルに設定できる場合もあります。しかし、それはWin8でのみ機能し、Win10では失敗します。これが他の誰かがこれを便利だと思った場合に私がやったことです:
RegistryKey registryKey = Registry.CurrentUser.CreateSubKey("Software\\Microsoft\\TabletTip\\1.7");
registryKey?.SetValue("KeyboardLayoutPreference", 0, RegistryValueKind.DWord);
registryKey?.SetValue("LastUsedModalityWasHandwriting", 1, RegistryValueKind.DWord);
Process.Start(@"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe");
レジストリのアイデアについては、この投稿にクレジットを与える必要があります: Windows 8デスクトップアプリ:tabtip.exeをセカンダリキーボードに開きます(数値テキストボックス用)
私の知る限り、osk.exe
またはtabtip.exe
ほぼこの作業を行うための「標準的な」方法です。これまでのところ、「公式」ソリューションは見つかりませんでした。
ただし、これを実行しているのであれば、プロセスを強制終了したり、キーを送信してキーボードを終了したりすることはありません。代わりに、プロセスの起動時にウィンドウハンドルを取得し、それを使用してウィンドウを最小化し、タスクバーから非表示にすることができます。
ここの誰かがそれを閉じるためにウィンドウハンドルを手に入れましたが、それはあなたにアイデアを与えます: WPFからスクリーンキーボード上のWindows 8を表示して非表示にする
あなたが私を必要とするならば、私に知らせてください、そして、私は私が完全な例をする時間を見つけることができるかどうか見るでしょう。
TextBoxコントロールの代わりにRichTextBoxを使用します。 RichTextBoxはタッチキーボードをサポートし、フォーカスが取得されるとキーボードを自動的にポップアップ表示します。 (コンボボックスなどの他の入力コントロールと同様)
また、RichTextBoxはTextBoxと同じプロパティをサポートしているため、ほとんどの場合は変更が必要です。 (両方のコントロールはTextBoxBaseから派生しています)
タッチキーボードがポップアップした後に閉じられた場合、コントロールを2回タップしてポップアップを戻す必要がある場合があることに気付きました。