質問

VolumeMute Keypressをシミュレートするために、次のコードを取得しました。

    [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でサウンドをミュート/ミュートする別の方法があることは知っていますが、sendmessagewを使用したくありませんキーステートを使用して音をミュートするか、音をミュートする必要があるため(ユーザーが音を解除したい場合は、すでに調子をwheしていない場合その後、私は切り替える必要はありません - それが私がボリュームミューートキープレスをシミュレートする必要がある理由です)

ありがとう。

役に立ちましたか?

解決

それがうまくいかない最初の理由は、間違ったdllを使用しているため、coredll.dllはWindowsモバイルです。 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()にフォールバックする必要があります。有効なトップレベルのものである限り、実際のウィンドウハンドルは関係ありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top