Искусственно генерировать ключевые события в других программах - PullRequest
2 голосов
/ 29 мая 2011

Может ли программа на C # с фокусом искусственно генерировать ключевое событие, которое будет обрабатываться другим открытым приложением?

Для тех, кому интересно, вот почему я спрашиваю:

В настоящее время я работаю над демонстрацией / макетом для идеи дизайна для медиаплеера на основе жестов с использованием Kinect в качестве основного устройства ввода.Это то, что я решил сделать в качестве одолжения, и это не требует и не заслуживает тонны моего времени в плане программирования.

Поэтому, чтобы ускорить процесс, я использую инструмент FAAST, который выможно использовать, чтобы легко связать ключевые события с определенными жестами.Итак, вы включаете эту программу, сообщаете ей, какая клавиша соответствует какому жесту, а затем, когда вы делаете жест, клавиша регистрируется как нажатая текущим приложением.

То, что я хотел бы создать, - это переходмежду ними будет отображаться простой графический интерфейс, который я покажу аудитории.В определенный момент пользователь сделает жест «выбор», и я хочу, чтобы музыка начала воспроизводиться в открытом медиаплеере.Итак, я бы проверил их место в иерархии меню, чтобы убедиться, что они выбрали «музыку» на основе некоторого ключа, который я выбрал для произвольного выбора, а затем сгенерировали событие ключа с помощью ключа MediaPlayPause.

1 Ответ

1 голос
/ 29 мая 2011

Требуется немного работы p / invoke для C #, но это не сложно.Вы будете использовать API FindWindow для получения hWnd для целевой программы, а затем API PostMessage для отправки ключевых событий:

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
private static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

private const UInt32 WM_KEYDOWN = 0x0100;
private const UInt32 WM_KEYUP = 0x0101;

public static void SendSelect(IntPtr HWnd)
{
    PostMessage(HWnd, WM_KEYDOWN, KeyInterop.VirtualKeyFromKey(System.Windows.Input.Key.Enter), 0);
}
...