C# PostMessage 到 Spotify

Posted

技术标签:

【中文标题】C# PostMessage 到 Spotify【英文标题】:C# PostMessage to Spotify 【发布时间】:2015-09-18 12:38:18 【问题描述】:

我正在使用 C# 查找 Space 的按键(Pause/Play link 的键盘快捷键)并将其发布到 Spotify 应用程序。 我可以成功找到正确的窗口并使用第一部分代码复制它的名称。 但是当我尝试使用几乎完全相同的代码来发布消息时,它就不起作用了。我怀疑 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);
            
        
    

感谢您提供的任何帮助

/摩根

【问题讨论】:

尝试比“它不起作用”更具体一点。什么行不通?发生什么了?有错误信息吗?你试过调试吗? 【参考方案1】:

改为发送多媒体播放/暂停键的键码。 Spotify 客户端会对此进行侦听。

详情请见this SO answer

【讨论】:

是的,这比我的方式更安全,更合理:)【参考方案2】:

很遗憾,Spotify 不是本机 Windows 应用程序。就 UI 而言,它主要只是 Chrome 的一个包装器。这在使用 Spy++ 时很容易看到 - 在 Spotify 窗口中按空格键不会触发任何WM_KEYDOWN 消息或任何类似的消息。

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

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

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

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

【讨论】:

以上是关于C# PostMessage 到 Spotify的主要内容,如果未能解决你的问题,请参考以下文章

执行从 C# 到 EuroTruck 的密钥输出不起作用(PostMessage、user32.dll)

C# 使用 PostMessage

PostMessage 的字节数组封送处理

C# 或 C++ - 创建假焦点?

从其他应用程序 C# 中获取按键

postMessage隐患