0

KeyDown および KeyPress イベントを介してキーストロークを監視する C# アプリがあります。具体的には、(ハンドヘルド デバイスからの) VolumeMute キーストロークを監視して、特別な処理を行います。Windows が VolumeMute キーストロークを傍受し、システム ボリュームをミュートするようです (これは望ましくありません)。キーストロークが処理されたことを通知しても (e.Handled = true)、とにかくシステムの音量がミュートされるため、Windows はアプリによって処理される前にキーストロークをインターセプトすると思います。ところで、同じコードは、私がキャッチしている他のキーストローク (バックスペースなど) に対しても完全に機能します。

Windows がこの音量ミュートを行うのを止める方法はありますか?

システム: WinXP SP3、.Net 4 クライアント プロファイル、Windows フォーム アプリ

コードスニップ

    bool keyHandled = false;

    private void Form1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (keyHandled)
        {
            e.Handled = true;
        }
    }
    // =====================================
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        keyHandled = false;



        switch (e.KeyCode)
        {

            case Keys.VolumeMute:
                DoSpecialProcessing(); 
                keyHandled = true;
                break;
            default:

                break;
        }

        e.Handled = keyHandled;

    }               
4

2 に答える 2

0

Ok。AutoHotKey を使用して、VolumeMute を別のキーに再マップすることになりました。重要なことに、Windows は、再マッピングされる前に VolumeMute キーストロークを認識せず、サウンドをミュートしません。そのため、必要なときにこの AutoHotKey リマップ スクリプトを開始できます。Windowsレジストリをいじるのに勝ります。提案をありがとう。

于 2012-06-07T19:03:53.073 に答える
0

このボタンはトグルのように機能し、最初に押すとミュートになり、次に押すと「ミュート解除」されます。必要なのは、VolumeMute プレスをもう一度シミュレートすることだけです。

この回答は、その方法を説明しています。

注: KeyDown ハンドラー内からこのメソッドを呼び出す場合は、BeginInvoke または PostMessage を使用してメッセージをメッセージ キューに投稿し、競合状態を回避するためにすぐに戻る必要があります。

于 2012-06-07T00:57:23.140 に答える