web-dev-qa-db-ja.com

WPFからのスクリーンキーボード上のWindows8の表示と非表示

Windows8タブレット用のWPFアプリケーションを作成しています。これは完全なWindows8であり、ARM/RTではありません。

ユーザーがテキストボックスを入力すると、次のコードを使用して画面キーボードが表示されます。

System.Diagnostics.Process.Start(@"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe");

これは問題なく動作しますが、キーボードを再び非表示にする方法がわかりませんか?

誰かがこれを行う方法を知っていますか?

また、キーボードが表示されたときにフォーカスされたコントロールが上に移動するようにアプリケーションのサイズを変更する方法はありますか? Windows RTアプリケーションの場合と少し似ています。

どうもありがとう

13
Sun

次のC#コードを使用して、オンスクリーンキーボードを正常に閉じることができました。

[DllImport("user32.dll")]
public static extern int FindWindow(string lpClassName,string lpWindowName);

[DllImport("user32.dll")]
public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);

public const int WM_SYSCOMMAND = 0x0112;
public const int SC_CLOSE = 0xF060;

private void closeOnscreenKeyboard()
{
    // retrieve the handler of the window  
    int iHandle = FindWindow("IPTIP_Main_Window", "");
    if (iHandle > 0)
    {
        // close the window using API        
        SendMessage(iHandle, WM_SYSCOMMAND, SC_CLOSE, 0);
    }  
}

private void Some_Event_Happened(object sender, EventArgs e)
{
    // It's time to close the onscreen keyboard.
    closeOnscreenKeyboard();
}

これがお役に立てば幸いです。

17
tasasaki

少し遅れて、ユーザーがWindows 8タブレット用のWPFアプリケーションでtextBoxをクリックしたときに、gotFocus/LostFocusイベントで表示/非表示を有効にするために行ったことの完全な例としてtasakiの例を改善します。同様の頭痛の種は、InkHelperを無効にするため、タッチイベントでスクロールしたい場合は実際にはうまく機能しません...

まず、これらの参照をApp.Xaml.csファイルに追加する必要があります。

using System.Management;
using System.Runtime.InteropServices;

コード:

    protected override void OnStartup(StartupEventArgs eventArgs)
    {
        EventManager.RegisterClassHandler(typeof(TextBox), UIElement.GotFocusEvent,
                                new RoutedEventHandler(GotFocus_Event), true);
        EventManager.RegisterClassHandler(typeof(TextBox), UIElement.LostFocusEvent,
                                new RoutedEventHandler(LostFocus_Event), true);

       MainApplication.Show();
    }

    private static void GotFocus_Event(object sender, RoutedEventArgs e)
    {
       // TestKeyboard();
        OpenWindows8TouchKeyboard(sender, e);
    }
    //http://www.c-sharpcorner.com/UploadFile/29d7e0/get-the-key-board-details-of-your-system-in-windows-form/
    private static bool IsSurfaceKeyboardAttached()
    {
        SelectQuery Sq = new SelectQuery("Win32_Keyboard");
        ManagementObjectSearcher objOSDetails = new ManagementObjectSearcher(Sq);
        ManagementObjectCollection osDetailsCollection = objOSDetails.Get();
        //Windows 8 tablet are returnign 2 device when keyboard is connecto
        //My application won't be used for Desktop so this condition is fine
        //But u might want to see if keyboard is usb and == 1 so you are 
        //returning true or not on tablet.  
        return osDetailsCollection.Count <= 1 ? true : false;
    }

    private static void OpenWindows8TouchKeyboard(object sender, RoutedEventArgs e)
    {
        var textBox = e.OriginalSource as TextBox;        
        if (textBox != null && IsSurfaceKeyboardAttached())
        {
            var path = @"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe";
            if (!File.Exists(path))
            {
                // older windows versions
                path = Environment.GetFolderPath(Environment.SpecialFolder.System) + @"\osk.exe";
            }
            Process.Start(path);
            textBox.BringIntoView();//SetFocus so u dont lose focused area
        }
    }
    [DllImport("user32.dll")]
    public static extern int FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll")]
    public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);

    public const int WM_SYSCOMMAND = 0x0112;
    public const int SC_CLOSE = 0xF060;
    public const int SC_MINIMIZE = 0xF020;

    private void CloseOnscreenKeyboard()
    {
        // retrieve the handler of the window  
        int iHandle = FindWindow("IPTIP_Main_Window", "");
        if (iHandle > 0)
        {
            // close the window using API        
            SendMessage(iHandle, WM_SYSCOMMAND, SC_CLOSE, 0);
        }
    }

    private void LostFocus_Event(object sender, EventArgs e)
    {
        // It's time to close the onscreen keyboard.
        CloseOnscreenKeyboard();
    }
6
Guillaume

WPFアプリでのTabTip統合に関するすべてを自動化するために、プロジェクトをオープンソース化しました。

nuget で取得できます。その後、必要なのは、アプリの起動ロジックでの単純な構成だけです。

TabTipAutomation.BindTo<TextBox>();

TabTip自動化ロジックを任意のUIElementにバインドできます。仮想キーボードは、そのような要素がフォーカスを取得すると開き、要素がフォーカスを失うと閉じます。それだけでなく、TabTipAutomationはUIElement(またはWindow)をビューに移動するため、TabTipはフォーカスされた要素をブロックしません。

詳細については、 プロジェクトサイト を参照してください。

これを試してみてください

System.Diagnostics.Process.Start("TabTip.exe");

これがお役に立てば幸いです。

0

プログラムでキーボードを非表示する方法がわかりませんが、ご存知のとおり、最近、トリガーする方法のサンプルを公開しました(as-in、show )ユーザーがテキストボックスをクリックしたときのWPFアプリケーションのタッチキーボード。ここでは次のようになります。

http://code.msdn.Microsoft.com/Enabling-Windows-8-Touch-7fb4e6de

このサンプルの優れた点は、Processを使用する必要がなく、代わりにサポートされているWindows 8 APIを使用して、自動化を使用してTextBoxコントロールのタッチキーボードをトリガーすることです。

それは私が何ヶ月も取り組んできたものであり、私はついにこの例を私たちのコミュニティに貢献できてうれしいです。サンプルのQ&Aペインに質問、提案、問題などがある場合はお知らせください

0
Dmitry Lyalin

このブログで公開されているソリューションを試すことができるかもしれません: http://mheironimus.blogspot.nl/2015/05/adding-touch-keyboard-support-to-wpf.html

それはあなたが求めたもののいくつか(そしてそれ以上)を含んでいます:

  • キーボードの表示と非表示
  • FrameworkElement.BringIntoView ()を使用してフォーカスを移動します
  • FrameworkElement.InputScope表示するキーボードレイアウト(数値、電子メール、URLなど)を選択するプロパティ
0
pogosama

さて私はこのようなことを試してみます

Process myProcess = Process.Start(@"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe");
myProcess.CloseMainWindow();
myProcess.Close();
0
Kapitán Mlíko