Play/Pause 登录 RDP 时的本地音乐

Play/Pause Local Music While Logged Into RDP

我的大部分工作都是通过远程桌面连接完成的。工作时我会经常在本地机器上听音乐。我知道这是一件小事,但当我需要暂停我的音乐时,我必须首先最小化我的 RDP 会话,以便我的键盘宏将应用于本地机器而不是远程机器。

我尝试创建一个简单的 c# 应用程序,它将模拟 play/pause、下一步、上一步​​的按键,但这并不能解决我的问题,因为它仍在模拟按键。我的问题是如何在不最小化 RDP 会话的情况下控制本地计算机上的音乐?

这是我目前使用的代码,也许我需要不同的方法?

    {
        [DllImport("user32.dll")]
        public static extern void keybd_event(byte virtualKey, byte scanCode, uint flags, IntPtr extraInfo);

        public const int KEYEVENTF_EXTENTEDKEY = 1;
        public const int KEYEVENTF_KEYUP = 0;
        public const int VK_MEDIA_NEXT_TRACK = 0xB0;// code to jump to next track
        public const int VK_MEDIA_PLAY_PAUSE = 0xB3;// code to play or pause a song
        public const int VK_MEDIA_PREV_TRACK = 0xB1;// code to jump to prev track
        public const int VK_VOLUME_UP = 0xAF;
        public const int VK_VOLUME_DOWN = 0xAE;
        public const int VK_VOLUME_MUTE = 0xAD;

        static void Main(string[] args)
        {
            
            var command = args[0];

            switch (command) {
                case "previous":
                    Console.WriteLine($"command = {command}");
                    // Jump to previous track
                    keybd_event(VK_MEDIA_PREV_TRACK, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero);
                    break;
                case "play/pause":
                    Console.WriteLine($"command = {command}");
                    // Play or Pause music
                    keybd_event(VK_MEDIA_PLAY_PAUSE, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero);
                    break;
                case "next":
                    Console.WriteLine($"command = {command}");
                    // Jump to next track
                    keybd_event(VK_MEDIA_NEXT_TRACK, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero);
                    break;
                case "up":
                    Console.WriteLine($"command = {command}");
                    // Jump to next track
                    keybd_event(VK_VOLUME_UP, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero);
                    break;
                case "down":
                    Console.WriteLine($"command = {command}");
                    // Jump to next track
                    keybd_event(VK_VOLUME_DOWN, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero);
                    break;
                case "mute":
                    Console.WriteLine($"command = {command}");
                    // Jump to next track
                    keybd_event(VK_VOLUME_MUTE, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero);
                    break;
                default:
                    Console.WriteLine($"command = NOT RECOGNIZED");
                    break;
            }
        }
    }```

我最终获得了我的计算机桌面的句柄并将其传递到 keydb_event。

class Program
{
    [DllImport("user32.dll")]
    static extern IntPtr GetDesktopWindow();
    
    [DllImport("user32.dll")]
    public static extern void keybd_event(byte virtualKey, byte scanCode, uint flags, IntPtr extraInfo);

    public const int KEYEVENTF_EXTENTEDKEY = 1;
    public const int KEYEVENTF_KEYUP = 0;
    public const int VK_MEDIA_NEXT_TRACK = 0xB0;// code to jump to next track
    public const int VK_MEDIA_PLAY_PAUSE = 0xB3;// code to play or pause a song
    public const int VK_MEDIA_PREV_TRACK = 0xB1;// code to jump to prev track
    public const int VK_VOLUME_UP = 0xAF;
    public const int VK_VOLUME_DOWN = 0xAE;
    public const int VK_VOLUME_MUTE = 0xAD;

    static void Main(string[] args)
    {
        var command = args[0];

        var handle = GetDesktopWindow();

        switch (command) {
            case "previous":
                Console.WriteLine($"command = {command}");
                // Jump to previous track
                keybd_event(VK_MEDIA_PREV_TRACK, 0, KEYEVENTF_EXTENTEDKEY, handle);
                break;
            case "play/pause":
                Console.WriteLine($"command = {command}");
                // Play or Pause music
                keybd_event(VK_MEDIA_PLAY_PAUSE, 0, KEYEVENTF_EXTENTEDKEY, handle);
                break;
            case "next":
                Console.WriteLine($"command = {command}");
                // Jump to next track
                keybd_event(VK_MEDIA_NEXT_TRACK, 0, KEYEVENTF_EXTENTEDKEY, handle);
                break;
            case "up":
                Console.WriteLine($"command = {command}");
                // Jump to next track
                keybd_event(VK_VOLUME_UP, 0, KEYEVENTF_EXTENTEDKEY, handle);
                break;
            case "down":
                Console.WriteLine($"command = {command}");
                // Jump to next track
                keybd_event(VK_VOLUME_DOWN, 0, KEYEVENTF_EXTENTEDKEY, handle);
                break;
            case "mute":
                Console.WriteLine($"command = {command}");
                // Jump to next track
                keybd_event(VK_VOLUME_MUTE, 0, KEYEVENTF_EXTENTEDKEY, handle);
                break;
            default:
                Console.WriteLine($"command = NOT RECOGNIZED");
                break;
        }