2

私のアプリケーションでは、個々のキーが WPF ボタンになるオンスクリーン キーボードを作成しています。対応する仮想キーコード(ボタンごと)をOSに送信したい。

たとえば、アプリケーションにコンテンツが「A」のボタンがあります。クリックすると、仮想キーコード「A」が OS に送信され、ハードウェア キーボードと同様に、アクティブなアプリケーションのフォーカスされたテキスト ボックスに「A」が追加されます。

そのために使用できるクラスとメソッドはありますか。SendKeys.SendWait("{A}"); で試しました。しかし、WPFでは機能しません。

4

1 に答える 1

4

私のコメントを説明SendKeys.SendWaitすると、WPF では機能しますが、機能しSendKeys.Sendません。問題の 1 つは、A を別のアプリケーションに送信しようとしている場合、形式が間違っていることです。中かっこは、文字 A には存在しない特別なキーであることを示します。SendKeys.SendWait("A")代わりに使用する必要があります。もう 1 つの問題は、Wpf アプリケーションをキーボードとして使用している場合、ボタンをクリックした時点でフォアグラウンド アプリケーションになることです。WinApi と Pinvoke のいくつかの関数、つまりFindWindowとを詳しく調べる必要がありSetForegroundWindowます。

SendKeys.Send のリンクから:

別のアプリケーションをアクティブにするマネージ メソッドがないため、現在のアプリケーション内でこのクラスを使用するか、FindWindow や SetForegroundWindow などのネイティブ Windows メソッドを使用して、他のアプリケーションにフォーカスを強制することができます。

別のアプリケーションに切り替える方法を示すサンプル (例としてメモ帳を使用しています)

public partial class MainWindow : Window
{
    [DllImport("user32.dll", EntryPoint="FindWindow", SetLastError = true)]
    static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SetForegroundWindow(IntPtr hWnd);

    public MainWindow()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        SetForegroundWindow(FindWindowByCaption(IntPtr.Zero, "Untitled - Notepad"));
        SendKeys.SendWait("A");
    }
}
于 2013-07-29T07:11:18.953 に答える