3

C# WPF アプリケーションで Win32 API 呼び出しを行うことにより、システムのオーディオ ボリュームを変更しようとしています。私が見たすべてのサイトで、次のようなコードが表示されました。

double val_c = 0;

private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    const uint WM_APPCOMMAND = 0x319;
    const uint APPCOMMAND_VOLUME_UP = 10;
    const uint APPCOMMAND_VOLUME_DOWN = 9;
    const uint APPCOMMAND_VOLUME_MUTE = 8;

    IntPtr handy = this.Handle;

    if (slider1.Value < val_c)
    {
        Win32.Win32.SendMessage(handy, WM_APPCOMMAND, handy, new IntPtr(APPCOMMAND_VOLUME_DOWN));
    }
    else
    {
        Win32.Win32.SendMessage(handy, WM_APPCOMMAND, handy, new IntPtr(APPCOMMAND_VOLUME_UP));
    }
    val_c = slider1.Value;
}

設定しようとしている正確な値を指定する場所がわかりません。

上記のコードは、ボリュームをどの値だけインクリメントしますか? 実際、上記がいくつかのフォーラムやブログなどに投稿されているにもかかわらず、私はそれを機能させることができません。最後の引数に「* 0x10000」を追加した場合にのみ機能します。それでも私はその重要性を理解することはできません。

スライダー (最小値 0、最大値 100) の値が変更されたときに上記を実行するように設定しましたが、スライダーは実際のシステム ボリュームと同期していません。スライダーを 25 に設定するだけで、システム ボリュームを 100 に設定できます。

4

1 に答える 1

1

2つの問題があると思います。1 つはメッセージ パラメータの定義で、次のようになります。

const uint WM_APPCOMMAND = 0x319;
const uint APPCOMMAND_VOLUME_UP = 0xA0000;
const uint APPCOMMAND_VOLUME_DOWN = 0x90000;
const uint APPCOMMAND_VOLUME_MUTE = 0x80000;

もう 1 つは、スライダーの現在の値と前の値の差に応じて、上下の変更を何度も適用する必要があることです。

したがって、次のようなものです (メッセージ引数は as としてのみキャストしIntPtrnew'edではないことに注意してください

if (slider1.Value < val_c)
{
    int nDiff = (int)(val_c - slider1.Value);
    for (int i = 0; i < nDiff; ++i)
    {
        Win32.Win32.SendMessage(handy, WM_APPCOMMAND, handy, (IntPtr)APPCOMMAND_VOLUME_DOWN);
    }
}
else
{
    int nDiff = (int)(slider1.Value - val_c);
    for (int i = 0; i < nDiff; ++i)
    {
        Win32.Win32.SendMessage(handy, WM_APPCOMMAND, handy, (IntPtr)APPCOMMAND_VOLUME_UP);
    }
}

上記のコードは、いくらか単純化できます。

IntPtr pArg = (slider1.Value < val_c) ? (IntPtr)APPCOMMAND_VOLUME_DOWN : (IntPtr)APPCOMMAND_VOLUME_UP;
int nDiff = (int)Math.Abs(val_c - slider1.Value);
for (int i = 0; i < nDiff; ++i)
{
    Win32.Win32.SendMessage(handy, WM_APPCOMMAND, handy, pArg);
}

他の唯一のことは、スライダーを正しい初期値に設定できるように、アプリケーションの起動時に現在の音量設定を知る必要があるということです。

これを行う方法を示す(より複雑な)チュートリアルがここにありますが、開始時に最初にボリュームを既知の値に設定する方が実用的かもしれません(つまり、ボリュームを100回下げて、ゼロになるようにします)起動)。

于 2013-06-09T07:53:43.553 に答える