C# PostMessage 到 Spotify

C# PostMessage to Spotify

我正在使用 C# 查找和 post Space(Pause/Play link 的键盘快捷键)到 Spotify 应用程序的按键。 我可以成功找到正确的 window 并使用代码的第一部分复制它的名称。 但是,当我尝试对 post 消息使用几乎完全相同的代码时,它不起作用。我怀疑 PostMessage 部分有问题,但我不知道是什么。

代码:

private void button1_Click(object sender, EventArgs e)
{
    foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
    {
        if (p.ProcessName == "Spotify")
        {
            if (!p.MainWindowTitle.StartsWith("Spotify") && p.MainWindowTitle.Length > 0)
            {
                label1.Text = p.MainWindowTitle;
                Console.WriteLine(label1.Text);
                break;
            }
            else
            {
                label1.Text = "No Music";
            }
        }
    }
}

[DllImport("user32.dll", SetLastError = true)]
static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

private static Int32 WM_KEYDOWN = 0x0100;
private static Int32 WM_KEYUP = 0x0101;

private void button2_Click(object sender, EventArgs e)
{
    foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
    {
        if (p.ProcessName == "Spotify")
        {
            Console.WriteLine(p.MainWindowTitle);
            if (p.MainWindowTitle.Length > 0)
            {
                PostMessage(p.MainWindowHandle, (uint)WM_KEYDOWN, (IntPtr)Keys.Space, IntPtr.Zero);
            }
        }
    }
}

感谢您提供的任何帮助

/摩根

很遗憾,Spotify 不是本机 windows 应用程序。就 UI 而言,它主要只是 Chrome 的包装器。这在使用 Spy++ 时很容易看出 - 在 Spotify window 中按 Space 不会触发任何 WM_KEYDOWN 消息或任何类似的消息。

也许可以找到其他方法来伪造它(例如,WM_LBUTTONDOWN 似乎已正确发送),但避免 windows 消息传递的应用程序通常更难实现自动化。

幸运的是,应用程序 确实 响应 WM_COMMAND。以下对我有用:

PostMessage(hwnd, WM_COMMAND, 0x18007D07, 0x000E0880);

不过我不能告诉你这有多安全。 wParam 可能会保持不变,因为那只是通知代码和控件 ID。不过,我不确定 lParam

改为发送多媒体 Play/Pause 键的键码。 Spotify 客户端对此进行监听。

详情见this SO answer