5

C#SendKeys.Sendメソッドを使用して問題を実行しています。キーボードのキーを他のキーに置き換えようとしています。たとえば、キーボードで「a」を押したとき、たとえばコードでこれを行っているときは、そのキーを「s」にします。

if ((Keys)keyCode== Keys.A)
{                    
    SendKeys.Send("s");                    

}

現在、メモ帳には「sa」文字のみが印刷されていますが、この場合、キーボードの「a」を押すと「a」を置き換える必要があるため、「sa」を印刷する代わりに「s」文字のみを印刷する必要があります。 「s」付き。

次の行を追加して、最後の文字を削除してみました。

SendKeys.Send("{BS}");

しかし、私が得たのは「s」文字が削除され、「a」文字がそこにあったことだけです。

どうすればこれを防ぐことができますか?

4

9 に答える 9

2

私は私の呼び出しを逆にします:

SendKeys.Send("{BS}");

SendKeys.Send("S");

編集(質問が更新された後):

文字列(特殊文字用)を使用している場合は、キーを押す( "a")によって生成された文字列をキャプチャし、文字列を試行している文字のUnicode値に設定して変更することはできません。表現します?人々が言及している他の解決策が機能していない場合、それは私が次に試みるところです...

于 2009-06-18T13:36:45.433 に答える
2

私は悪い仮定をしているかもしれませんが、これをテキストボックスで使用している場合は、次のことができます。

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 'a')
    {
        e.Handled = true;
    }
}

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.A)
    {
        e.Handled = true;
        SendKeys.Send("s");
    }
}

またはさらに簡単:

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 'a')
    {
        e.Handled = true;
        SendKeys.Send("s");
    }
}

または、これがテキストボックスだけで使用するのではない場合は、バックスペースとキー送信を元に戻すことはできませんか?

if ((Keys)keyCode== Keys.A)
{                    
    SendKeys.Send("{BS}"); // remove A
    SendKeys.Send("s");    // add S
}
于 2009-06-18T13:42:33.723 に答える
2

もう1つのオプションは、低レベルのキーボードフックを使用して古い文字をトラップしてから、新しい文字を送信することです。P / Invokeが必要になりますが、元のキーを完全にトラップして、アプリに表示されないようにすることができます。

于 2009-06-18T14:06:54.080 に答える
1

「s」の直後にバックスペースが送信され、「s」文字が削除されるため、「a」が出力されます。どうすればこれを防ぐことができますか?

うーん.....

sを送信した直後にバックスペースを送信しませんか?

if ((Keys)keyCode== Keys.A)
            {
                Sendkeys.Send("{BS}"); // Deletes the "A" (already sent)
                SendKeys.Send("s"); // Sends the "S"
            }
于 2009-06-18T13:34:20.883 に答える
1

SendKeys.SendWait

于 2009-06-18T13:36:59.177 に答える
1

これはあなたが望む/必要なものではないかもしれませんが、いくつかのキーボードキーを再マップしたいだけの場合は、別のキーボードレイアウトを使用するか、カスタムレイアウトを作成することをお勧めします。これを使用して新しいレイアウトを作成できます。

http://msdn.microsoft.com/en-ca/goglobal/bb964665.aspx

于 2009-06-18T13:50:48.057 に答える
1

SendKeys.Send("{BS}");このアプローチは(どちらの順序でも)機能しないと思います。これは、元のキーが押された/キーが解放されたイベントがSendKeys.Send投稿後に処理されるためです。ターゲットウィンドウの手順(メモ帳など)で処理する前に、削除する文字のキーダウン/キーアップイベントをなんとかしてキャンセルする必要があると思います。

于 2009-06-18T14:10:09.593 に答える
0

で切り替え.Send({BS})てみました.Send("s")か?そうでなければ、あなたは明確にすることができますか?

于 2009-06-18T13:35:40.397 に答える
0

グローバルホットキーを登録することでこの問題を解決しました。ありがとうございました。 これは私が自分の問題を解決するために使用したリソースでした。

于 2009-06-18T22:37:19.393 に答える