Я создаю программу, которая будет отправлять входные данные мультимедиа (такие как MediaPlayPause
, MediaNextTrack
и т. Д.) В приложение, которое у меня имеет IntPtr
.Вроде как виртуальный пульт дистанционного управления.
Итак, после исследования я нашел это , которое почти говорит мне, как именно решить мою проблему.
Однако в подходе, упомянутом в ссылке, есть три проблемы.
- Я не могу установить приложение в качестве переднего окна, так как мне нужно, чтобы мое приложение было сфокусировано.
- Они используют функцию SendKeys , которая требует, чтобы целевое окно былосфокусировано, идет против проблемы 1.
- Из того, что я знаю, 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);
}