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
我正在使用 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