web-dev-qa-db-ja.com

WinForms入力フォーカスでタブレットタッチキーボードを自動的にポップアップ

Windows 10で タブレットモード でWinForms(またはDelphi、最後に参照)アプリケーションを実行すると、入力ボックスにフォーカスがあるときにタッチキーボードが自動的にポップアップしません。

追加のコード/セットアップなしで、これは自動的に行われるはずだと思います。


テストのために、単一の TextBox control を持つ最も単純なVS 2015 WinFormsデスクトップアプリケーションがあります。

enter image description here

これは、単に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
  • ハードウェアキーボードが「削除」された瞬間に入力ボックスにフォーカスがある場合(Lenovo Yogaノートブックで画面を反転させることでこれをテストします)、その後はそうではありません。

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タッチと書かれたアプリケーションが表示されない

37
Martin Prikryl

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を実装しません。それらの背後には異なる機械がなければなりません。

0
Martin Prikryl

根本的な原因は、WinformsのtextBoxがAutomationElementではなく、言及されているその他のコントロール(ComboBoxesなど)がそうであるようです。

Markus von und zu Heberの引用 ここで受け入れられた答え

記事「 Windows 8+上のWPFアプリケーションのTextBoxの自動タッチキーボード 」で発見しましたが、winformでも非常に優れた(そしてさらに簡単に!)動作します。ありがとう、ドミトリー・リアリン!

  1. UIAutomationClient.dllへの参照をプロジェクトに挿入します

  2. アプリケーションのメインウィンドウのform-load-handlerに、次のコードを挿入します。

    var asForm = System.Windows.Automation.AutomationElement.FromHandle(this.Handle);
    
9
Ofek Shilon

私はこの道を何回か行ってきましたが、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をセカンダリキーボードに開きます(数値テキストボックス用)

8
jaredbaszler

私の知る限り、osk.exeまたはtabtip.exeほぼこの作業を行うための「標準的な」方法です。これまでのところ、「公式」ソリューションは見つかりませんでした。

ただし、これを実行しているのであれば、プロセスを強制終了したり、キーを送信してキーボードを終了したりすることはありません。代わりに、プロセスの起動時にウィンドウハンドルを取得し、それを使用してウィンドウを最小化し、タスクバーから非表示にすることができます。

ここの誰かがそれを閉じるためにウィンドウハンドルを手に入れましたが、それはあなたにアイデアを与えます: WPFからスクリーンキーボード上のWindows 8を表示して非表示にする

あなたが私を必要とするならば、私に知らせてください、そして、私は私が完全な例をする時間を見つけることができるかどうか見るでしょう。

5
James Decker

TextBoxコントロールの代わりにRichTextBoxを使用します。 RichTextBoxはタッチキーボードをサポートし、フォーカスが取得されるとキーボードを自動的にポップアップ表示します。 (コンボボックスなどの他の入力コントロールと同様)

また、RichTextBoxはTextBoxと同じプロパティをサポートしているため、ほとんどの場合は変更が必要です。 (両方のコントロールはTextBoxBaseから派生しています)

タッチキーボードがポップアップした後に閉じられた場合、コントロールを2回タップしてポップアップを戻す必要がある場合があることに気付きました。

1
Rob Karmes