0

我正在尝试制作一个可以控制另一个应用程序音量的 Unity3D 应用程序。到目前为止,我已经开始改变所有应用程序的数量,但我很难让它只改变一个,例如 Spotify。这是在 Windows 8 上,但我希望它也适用于 Windows 7。

private const int APPCOMMAND_VOLUME_UP = 0xA0000;
private const int APPCOMMAND_VOLUME_DOWN = 0x90000;
private const int WM_APPCOMMAND = 0x319;

[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string strClassName, string strWindowName);

[DllImport("user32.dll", SetLastError = true)]
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId);

[DllImport("user32.dll")]
public static extern IntPtr GetActiveWindow();

public void DecreaseVolume()
{
    IntPtr hWnd = FindWindow("SpotifyMainWindow", "Spotify");

    if (hWnd == IntPtr.Zero)
        return;

    uint pID;
    GetWindowThreadProcessId(hWnd, out pID);

    Debug.Log(pID);

    SendMessage(hWnd, WM_APPCOMMAND, hWnd, (IntPtr)APPCOMMAND_VOLUME_DOWN);
}

public void IncreaseVolume()
{
    // same as above, but with APPCOMMAND_VOLUME_UP
}

我很确定我从 FindWindow() 中得到了正确的句柄 (hWnd),因为打印出来的 pID 与我的任务管理器中 Spotify 的 PID 匹配,但是这一切只是改变了所有东西的音量,而不仅仅是 Spotify。这与我没有指定特定句柄的结果相同,例如

SendMessage(IntPtr.Zero, WM_APPCOMMAND, IntPtr.Zero, (IntPtr)APPCOMMAND_VOLUME_DOWN);

或者如果我使用GetActiveWindow().

直到今天我才弄乱这些 windows api 的东西,所以任何帮助都将不胜感激!

4

0 回答 0