我正在尝试制作一个可以控制另一个应用程序音量的 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 的东西,所以任何帮助都将不胜感激!