2

タッチ スクリーンで使用される .NET 4 の WPF アプリケーションに取り組んでいます。組み込みの Windows OSK を入力に使用しようとしていますが、最後に残っている問題は、テキスト ボックスがフォーカスされるとすぐにキーボードが開くようにすることです。現在、テキスト ボックスがフォーカスされると、小さなキーボード アイコン (これは InputPanel アイコン) が表示され、ユーザーはそのアイコンをタップしてキーボードを開く必要があります。

アイコンのステップをスキップして、キーボードをずっと開いてフォーカスする方法はありますか? できれば、1 か所で設定またはコーディングでき、すべてのテキスト ボックスにグローバルに適用できるものが望ましいですか? また、アプリケーション スレッドの現在のカルチャ設定を使用する必要があります (既に実行されているようです)。

コントロール パネルの設定で、アイコンのステップをスキップできるものを見つけることができませんでした。TextInputPanel.CurrentInPlaceStateを使用するオンラインの例もいくつか見つけましたが、メイン ウィンドウのプレビュー フォーカスで TextInputPanel を開くコードを実装すると、COM INTEROP 例外が発生し続け、基本的に行き止まり (Microsoft.Ink.dllは相互運用 DLL です)。

デフォルトの CurrentInPlaceState を HoverTarget ではなく Expanded に変更できるレジストリ キーがある可能性はありますか? 私のネット検索では見つけられませんでした。

ありがとう、

ヴァレリー

編集:これは、メインウィンドウのコードビハインドに配置したコードと、取得し続ける例外メッセージです-そして、それが何を意味するのか、またはそれを修正する方法がわかりません(私のネット検索は失敗しました!)

protected override void OnPreviewGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
    {
        base.OnPreviewGotKeyboardFocus(e);

        TextBox textbox = e.NewFocus as TextBox;
        TextBox oldTextbox = e.OldFocus as TextBox;

        if (oldTextbox != null && boxesToInputs.ContainsKey(oldTextbox))
        {
            TextInputPanel oldPanel = boxesToInputs[oldTextbox];
            oldPanel.Dispose();
            boxesToInputs.Remove(oldTextbox);
        }

        if (textbox != null)
        {
            // Make sure we've cleaned up old panels, just in case
            if (boxesToInputs.ContainsKey(textbox))
            {
                boxesToInputs[textbox].Dispose();
                boxesToInputs.Remove(textbox);
            }

            TextInputPanel newPanel = new TextInputPanel(((HwndSource)PresentationSource.FromDependencyObject(textbox)).Handle);
            newPanel.DefaultInPlaceState = InPlaceState.Expanded;
            newPanel.DefaultInputArea = PanelInputArea.Keyboard;
            boxesToInputs[textbox] = newPanel;
        }
    }

そして、これは私のコードが TextInputPanel コンストラクターを呼び出すときに発生する例外メッセージです。

CLSID {F9B189D7-228B-4F2B-8650-B97F59E02C8C} を持つコンポーネントの COM クラス ファクトリの取得は、次のエラーが原因で失敗しました: 80040154 クラスが登録されていません (HRESULT からの例外: 0x80040154 (REGDB_E_CLASSNOTREG))

WPF アプリのプラットフォーム ターゲットが x86 であることを確認しました。Dependency Walker を実行したところ、使用していた Microsoft.Ink.dll が 64 ビットであり、2 つの遅延読み込み依存関係 (GPSVC.dll と IESHIMS.dll) が見つからないことがわかりました。Microsoft.Ink.dll の 32 ビット バージョンを見つけましたが、まだ同じエラーが発生し、Dependency Walker は同じことを言っています - GPSVC.dll と IESHIMS.dll がありません。

x64 をターゲットにすることはできません。不足している DLL をアプリケーション フォルダーに配置する必要はありません (それが機能する場合)。キーボードのヒントを取り除くだけで大変なことになるので、私が見逃している単純なものがあることを願っています...

アンマネージ/相互運用アセンブリの操作に関しては、私は少し初心者です...

4

1 に答える 1

1

私は同様の提案を調査しました。私の場合は、カスタム OSK を作成することでした。(今のところ) カスタム入力デバイスを作成することはできないようです。説明は次のリンクにあります: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a813a08a-7960-45fe-bc91-e81cdb75bd10

さらに、Win32 API 呼び出しを使用して SendKey メソッドにアクセスし、ターゲットとは別に入力をレポートする「回避策」を見つけました。私が見つけたプロジェクトは次のとおりです。 http://wosk.codeplex.com/

SendKey は WinForms でも利用できます ( http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspxを参照) が、同じ動作が生成されるかどうかはわかりません。

後日これらのオプションを確認しますが、おそらくこの情報の一部が役立つかもしれません.

よろしくハーバー

于 2011-09-23T13:42:57.777 に答える