2015-07-01 6 views
1

Я использую C# для поиска и публикации нажатия клавиши пробела (сочетание клавиш для паузы/воспроизведения link) в приложение Spotify. Я могу найти подходящее окно и скопировать его имя, используя первую часть кода. Но когда я пытаюсь использовать почти точный код для публикации сообщения, он не будет работать. Я подозреваю, что что-то не так с частью PostMessage, но я не могу понять, что.C# PostMessage to Spotify

Код:

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); 
      } 
     } 
    } 
} 

Спасибо за любую помощь вы можете предоставить

/Morgan

+2

Try быть немного более специфичен, чем «это не будет работать». Что не получится? Что происходит? Есть ли сообщение об ошибке? Вы пробовали отлаживать его? – AlexFoxGill

ответ

1

Вместо этого отправьте ключевой код мультимедийной кнопки Play/Pause. Клиент Spotify слушает это.

См this SO answer подробности

+0

Да, это намного безопаснее и разумнее моего пути :) – Luaan

0

К сожалению для вас, Spotify не является родным окна приложения. В основном это оболочка для Chrome, что касается интерфейса пользователя. Это легко увидеть при использовании Spy ++ - нажатие Space в окне Spotify не вызовет никакого сообщения WM_KEYDOWN или чего-либо подобного.

Возможно, есть возможность найти другой способ подделать это (например, WM_LBUTTONDOWN, кажется, отправлено должным образом), но приложения, избегающие обмена сообщениями Windows, как правило, гораздо сложнее автоматизировать.

К счастью, приложение делает отвечает на WM_COMMAND. Следующие работы для меня:

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

Я не могу сказать вам, насколько это безопасно. wParam, вероятно, останется прежним, так как это только код уведомления и идентификатор управления. Тем не менее, я не уверен в отношении lParam.

Смежные вопросы