C#ボリュームマッチプレスをシミュレートします
質問
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()にフォールバックする必要があります。有効なトップレベルのものである限り、実際のウィンドウハンドルは関係ありません。