5

volumemuteキー押下をシミュレートするために次のコードを取得しました。

    [DllImport("coredll.dll", SetLastError = true)]
    static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

    byte VK_VOLUME_MUTE = 0xAD;
    const int KEYEVENTF_KEYUP = 0x2;
    const int KEYEVENTF_KEYDOWN = 0x0;
    private void button1_Click(object sender, EventArgs e)
    {
            keybd_event(VK_VOLUME_MUTE, 0, KEYEVENTF_KEYDOWN, 0);
            keybd_event(VK_VOLUME_MUTE, 0, KEYEVENTF_KEYUP, 0);
    }

このコードは機能しません。SendMessageWでサウンドをミュート/ミュート解除する別の方法があることは知っていますが、KeyStateを使用して、サウンドをミュートまたはミュート解除する必要があるかどうかを検出するため、SendMessageWを使用したくありません(ユーザーがサウンドとその既にミュート解除したい場合)次に、切り替える必要はありません-そのため、VolumeMuteキー押下をシミュレートする必要があります)

ありがとう。

4

1 に答える 1

7

動作しない最初の理由は、間違った DLL を使用しているためです。coredll.dll は Windows Mobile です。Windows のデスクトップ バージョンでは、keybd_event は user32.dll によってエクスポートされます。うまくいかない 2 番目の理由は、キーストロークを送信するだけでは不十分だからです。理由はよくわかりませんが、これは一般的な入力ハンドラーの前にインターセプトされるようです。

WM_APPCOMMAND を使用できます。これはさまざまなコマンドをサポートしており、APPCOMMAND_VOLUME_MUTE はその 1 つです。これはトグルとして機能し、ミュートのオンとオフを切り替えます。コードを次のようにします。

    private void button1_Click(object sender, EventArgs e) {
        var msg = new Message();
        msg.HWnd = this.Handle;
        msg.Msg = 0x319;              // WM_APPCOMMAND
        msg.WParam = this.Handle;
        msg.LParam = (IntPtr)0x80000; // APPCOMMAND_VOLUME_MUTE
        this.DefWndProc(ref msg);
    }

このコードは、フォームのインスタンス メソッド内にある必要があります。DefWndProc() の使用方法に注意してください。他の場所に置きたい場合は、SendMessage() にフォールバックする必要があります。有効なトップレベルのものである限り、実際のウィンドウ ハンドルは重要ではありません。

于 2011-01-23T17:29:54.413 に答える