1

WPFアプリケーションをWindows8タブレットで実行するように移植しています。

テキストボックスがフォーカスを取得したときにTextInputPanelを表示し、フォーカスを失うと非表示にしたいのですが。

見せても問題ありませんが、近づけられないようです。

プロセスでKillとCloseMainWindowの両方を試しましたが、InvalidOperationExceptionが発生します-プロセスが終了したため、要求を処理できません。

SendMessageを試しましたが、何もしませんでした。

何か案は?

WinFormテストコードの一部は次のとおりです。

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace VirtualKeyboard
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
        static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

        static uint WM_CLOSE = 0x0010;
        static uint WM_QUIT = 0x0012;

        public Form1()
        {
            InitializeComponent();
        }

        private Process _keyboardProcess;

        private void Open_Click(object sender, EventArgs e)
        {
            _keyboardProcess = Process.Start(@"C:\Program Files\Common Files\microsoft shared\ink\tabtip.exe");
        }

        private void Close_Click(object sender, EventArgs e)
        {
            // tried all these
            //SendMessage(_keyboardProcess.Handle, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
            //SendMessage(_keyboardProcess.Handle, WM_QUIT, IntPtr.Zero, IntPtr.Zero);
            //_keyboardProcess.Kill();
            //_keyboardProcess.CloseMainWindow();
        }

    }
}
4

1 に答える 1

2

コメントで述べたように、TabTipはすぐに他の2つのプロセスを生成し、呼び出しプロセスを終了します。

開いているすべてのプロセスを繰り返し、TabTipと呼ばれるプロセスを閉じます。これにより、両方のプロセスが閉じられます。

using System;
using System.Diagnostics;
using System.Windows.Forms;

namespace VirtualKeyboard
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void Open_Click(object sender, EventArgs e)
        {
            Process.Start(@"C:\Program Files\Common Files\microsoft shared\ink\tabtip.exe");
        }

        private void Close_Click(object sender, EventArgs e)
        {
            Process[] processlist = Process.GetProcesses();

            foreach(Process process in processlist)
            {
                if (process.ProcessName == "TabTip")
                {
                    process.Kill();
                    break;
                }
            }
        }

    }
}
于 2013-03-01T02:14:04.697 に答える