Отправить ключ «MediaPlayPause» в приложение, не устанавливая на него фокус - PullRequest
2 голосов
/ 26 августа 2011

Я создаю программу, которая будет отправлять входные данные мультимедиа (такие как MediaPlayPause, MediaNextTrack и т. Д.) В приложение, которое у меня имеет IntPtr.Вроде как виртуальный пульт дистанционного управления.

Итак, после исследования я нашел это , которое почти говорит мне, как именно решить мою проблему.

Однако в подходе, упомянутом в ссылке, есть три проблемы.

  1. Я не могу установить приложение в качестве переднего окна, так как мне нужно, чтобы мое приложение было сфокусировано.
  2. Они используют функцию SendKeys , которая требует, чтобы целевое окно былосфокусировано, идет против проблемы 1.
  3. Из того, что я знаю, SendKeys не может отправлять кнопки клавиатуры, такие как кнопка Play / Pause клавиатуры.

В концеЯ не совсем понимаю, что мне нужно использовать (SendInput ?, SendMessage?).

Буду признателен за любую помощь.

РЕДАКТИРОВАТЬ

Используя полученный ответ, я взломал приведенный ниже пример кода.Теоретически предполагается найти блокнот и вставить в него букву "L".

Однако в блокноте ничего не отображается, и приложение не вылетает.Есть ли очевидная ошибка, которую я пропускаю?

[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
static extern IntPtr FindWindowByCaption(int ZeroOnly, string lpWindowName);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, IntPtr lParam);

const int WM_KEYDOWN = 0x100;
//const int WM_KEYUP = 0x101;
const int L_KEY = 0x4C;

private void button1_Click(object sender, EventArgs e)
{
    IntPtr ip = FindWindowByCaption(0, "Untitled - Notepad");

    SendMessage(ip, WM_KEYDOWN, L_KEY, IntPtr.Zero);
    //SendMessage(ip, WM_KEYUP, L_KEY, IntPtr.Zero);
}

1 Ответ

2 голосов
/ 26 августа 2011

Большинство этих ключей переведены в сообщения WM_APPCOMMAND * ... поэтому вы можете попробовать SendMessage, другой вариант - SendInput (если приложение основано на DirectInput) ...

Проверитьссылки в Windows API для общих функций медиаплеера? - возможно, есть какая-то информация, которую вы можете использовать ...

Что касается проблемы фокуса - не существует 100% надежного решения (см. Как отправлять нажатия клавиш в окно, не активируя его с помощью Windows API? ) ... лучшее, чего вы можете достичь со 100% надежностью, - это сфокусировать приложение, отправить ключи, перефокусировать ваше приложение... кроме того, что вы бы написали какой-то драйвер устройства (режим ядра) ...

...