C# обнаружение нажатий клавиш и отправка в фоновые окна
Сегодня я шесть часов искал способ завершить задачу, которую я хочу выполнить. Однако с небольшим везением каждый метод, который я пробовал, не работал.
Итак, программа, над которой я работаю, - это приложение для мультибокса для видеоигр. По существу, я хочу, чтобы мое созданное приложение работало в фоновом режиме. Пользователь установит флажок, чтобы указать, какие ключи он хочет захватить, поэтому не каждый ключ будет захвачен. Затем, когда они играя в основную игру, приложение будет отправлять ключи, которые проверяются в играх, работающих в фоновом режиме.
Я пробовал глобальные горячие клавиши, однако никогда не мог заставить работать больше одной клавиши. Я также пытался подключить ключи, но по какой-то причине не смог получить этот функционал. Я также баловался в sendmessage с небольшим успехом там тоже.
Было просто любопытно, есть ли у кого-нибудь еще какие-то идеи для этого. Приведу пример другой программы, которая делает то же самое это будут Хоткейнет, Кейклон и Исбоксер. Я знаю, что есть и другие, но это дает вам представление о том, что я пытаюсь сделать с моим приложением.
2 ответов:
Хорошо, после довольно небольшого исследования различных методов отправки нажатий клавиш и чтения нажатий клавиш. В конце концов, я смог объединить различные типы кодирования вместе, чтобы обеспечить результаты, которые я искал.
Я публикую ответ, так что любой, кто ищет ответ на этот вопрос позже, будет иметь его в своем распоряжении.
Мои две ссылки для соединения этого кода вместе являются следующий: http://www.codeproject.com/Articles/19004/A-Simple-C-Global-Low-Level-Keyboard-Hook
Отправить комбинацию нажатий клавиш в фоновое окно
Я использовал глобальный низкоуровневый Хук и postmessage для отправки нажатий клавиш в фоновое приложение.
Так что сначала вам нужно будет следовать инструкциям с самого начала ссылка, чтобы заставить исходный код работать.
Загрузите рабочий исходный код по ссылке один и используйте то глобалкибордхук.cs в вашем приложении.
Затем в ссылках поместите следующее:
Использование Системы.Во время выполнения.InteropServices; / / Grabs для ваших библиотек DLL
С помощью утилит; / / захватывает из файла, добавленного в приложение.
- Теперь вы хотите разместить в своем классе следующий код:
GlobalKeyboardHook gkh = новый globalKeyboardHook ();
[DllImport ("user32.dll")] / / используется для отправки нажатий клавиш в новое окно.
Публичный статический метод postMessage Экстерн указателя IntPtr(указателя IntPtr его hwnd, uint с МСГ, указателя IntPtr параметр wparam, указателя IntPtr lparam должен);
[DllImport ("user32.dll", EntryPoint = "FindWindow", CharSet = кодировка.Ansi)] / / используется для поиска окна для отправки нажатий клавиш.
Public static extern IntPtr FindWindow (string className, string windowName);
- теперь идите вперед, делайте ваши нажатия клавиш, вы хотите, чтобы вас схватили это я найдено лучше всего в Form1_Loaded:
ГКХ.HookedKeys.Добавить (Ключи.A); / / это собирает ключ A.
ГКХ.HookedKeys.Добавить (Ключи.B);//это собирает ключ B.
ГКХ.HookedKeys.Добавить (Ключи.C);//это собирает ключ C.
ГКХ.KeyDown += new KeyEventHandler(gkh_KeyDown); / / событие для нажатия клавиши вниз.
ГКХ.KeyUp += new KeyEventHandler(gkh_KeyUp); / / событие для освобождения ключа.
- после этого вы захотите пойти вперед и разместить в следующем в ваш код также:
Void gkh_KeyUp(object sender, KeyEventArgs e) / / что происходит при освобождении ключа.
{
LstLog.Предметы.Добавить ("Up\t" + e. код ключа.ToString ());
E. Handled = false; / / установка значения true приведет к тому, что глобальные горячие клавиши заблокируют все исходящие нажатия клавиш.
}
Void gkh_KeyDown(object sender, KeyEventArgs e) / / что происходит при нажатии клавиши.
{
LstLog.Предметы.Добавить ("вниз\t" + e. код ключа.ToString ());
E. обработано = false;
}
- Как только это будет сделано, просто поместите этот маленький бит в gkh_KeyDown, чтобы получите ваши нажатия клавиш для отправки в другое окно по вашему выбору:
Const uint WM_KEYDOWN = 0x100;
IntPtr hWnd = FindWindow (null, "Example1"); //найти окно Example1 для приложения.
Переключатель (т. е. код ключа)
{
Случай Ключи.A: //делает так, что он посылает только эту клавишу, когда она нажата, и никаких других клавиш.
Если (чка.Проверено = = true)
{
PostMessage (hWnd, WM_KEYDOWN, (IntPtr) (ключи.А), IntPtr.Ноль); //отправляет ключ A в новое окно, назначенное hWnd, которое равно Example1.
}
Перерыв;
}
}
Код, который я предоставил, настроен таким образом, что люди могут использовать флажок, чтобы сообщить программе, какие ключи они хотят отправить ко второму приложению.
Если у вас есть какие-либо вопросы относительно этого поста, просто дайте мне знать, и я сделаю все возможное, чтобы провести вас через этот процесс. Надеюсь, что это поможет кому-то в будущем.
Мое предложение-пойти с "отображенной памятью" (в понятиях операционной системы: общая память)
Первый процесс создает (может быть, ваша программа проверки состояния) создает отображенную память и записывает в нее значения.
Все остальные игровые процессы считывают значение из карты памяти, созданной первым процессом.
Вот очень хороший пример того, как это сделать.
Https://msdn.microsoft.com/en-us/library/dd267552 (v=против 110).aspx
Comments