0

テキストボックスがフォーカスされたときに仮想キーボードを実行していますが、キーボードアプリがフォーカスされ、キーをテキストボックスに転送しません。テキストボックスをクリックして有効にすると、すべて問題ありませんが、vKeyboard プロセスの実行後にアプリケーションを有効にしたいと考えています。これは私がこれまでに試したことです:

        [DllImport("user32.dll")]
    static extern bool PostMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll")]
    static extern bool SetForegroundWindow(IntPtr hWnd);
    [DllImport("user32.dll")]
    internal static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

....

        vKeyboard = Process.Start(keyboardPath);
        SetFocusToApplication(handle);

....

        private static void SetFocusToApplication(IntPtr handle)
    {
        Process currentProcess = Process.GetCurrentProcess();
        IntPtr hWnd = currentProcess.MainWindowHandle;
        if (hWnd != IntPtr.Zero)
        {
            SetForegroundWindow(handle);
            ShowWindow(hWnd,3);
        }
    }

また、Alt + Tab をキーボード プロセスに送信しようとしましたが、機能しません。

        private static void AltTab(IntPtr handle)
    {
             vKeyboard.WaitForInputIdle(); 

       int WM_SYSCOMMAND = 0x0112;
        int SC_PREVWINDOW = 0xF050;
        PostMessage(vKeyboard.MainWindowHandle, WM_SYSCOMMAND, (IntPtr)SC_PREVWINDOW, (IntPtr)0);
    }

PS: 仮想キーボードのソース コードを持っていますが、そこからそれ自体を非アクティブ化することができれば問題ありません。お知らせ下さい。また、キーボードの一番上のプロパティがtrueに設定されていますが、それが異なるかどうかはわかりません。

これは私が試しているコードで、ボタンクリックで機能しません:

           Process vKeyboard;
      string keyboardPath = Application.StartupPath + "\\vKeyboard.exe";
        vKeyboard = Process.Start(keyboardPath);
4

3 に答える 3

1

フォームに WS_EX_NOACTIVATE フラグが含まれるように、オンスクリーン キーボードのソース コードを変更します。

public partial class OnScreenKeyboard : Form
{

    private const int WS_EX_NOACTIVATE = 0x08000000;

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams p = base.CreateParams;
            p.ExStyle |= WS_EX_NOACTIVATE;
            return p;
        }
    }

}

これにより、OSK がフォーカスされなくなり、キーが現在アクティブなアプリケーションをターゲットにすることができます。

詳細については、この前の質問の私の例を参照してください。

于 2013-07-05T14:53:49.493 に答える
1

フォームを前面に移動するには、次を使用します。

this.Activate();

次のコードを試してみたところ、すべてが完全に機能しました (イベントでこのコードを書きましたTimer.Tick)。

System.Diagnostics.Process[] proc = System.Diagnostics.Process.GetProcessesByName("osk");
if (proc.Length > 0)
{
    this.Activate();
    textBox1.Focus(); //i focused it so i can write in it using on-screen keyboard
}
于 2013-07-05T06:55:14.823 に答える
0
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);

private void ActivateWindow()
{
    SetForegroundWindow(this.Handle);
}

このコードでは、メイン アプリ ウィンドウにいると想定されます。this.Handleそうでない場合は、メイン ウィンドウのハンドルで" " を変更する必要があります。

于 2020-08-28T06:42:51.497 に答える