C# обнаружение нажатий клавиш и отправка в фоновые окна



Сегодня я шесть часов искал способ завершить задачу, которую я хочу выполнить. Однако с небольшим везением каждый метод, который я пробовал, не работал.



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



Я пробовал глобальные горячие клавиши, однако никогда не мог заставить работать больше одной клавиши. Я также пытался подключить ключи, но по какой-то причине не смог получить этот функционал. Я также баловался в sendmessage с небольшим успехом там тоже.



Было просто любопытно, есть ли у кого-нибудь еще какие-то идеи для этого. Приведу пример другой программы, которая делает то же самое это будут Хоткейнет, Кейклон и Исбоксер. Я знаю, что есть и другие, но это дает вам представление о том, что я пытаюсь сделать с моим приложением.

926   2  

2 ответов:

Хорошо, после довольно небольшого исследования различных методов отправки нажатий клавиш и чтения нажатий клавиш. В конце концов, я смог объединить различные типы кодирования вместе, чтобы обеспечить результаты, которые я искал.

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

Мои две ссылки для соединения этого кода вместе являются следующий: http://www.codeproject.com/Articles/19004/A-Simple-C-Global-Low-Level-Keyboard-Hook

Отправить комбинацию нажатий клавиш в фоновое окно

Я использовал глобальный низкоуровневый Хук и postmessage для отправки нажатий клавиш в фоновое приложение.

  1. Так что сначала вам нужно будет следовать инструкциям с самого начала ссылка, чтобы заставить исходный код работать.

  2. Загрузите рабочий исходный код по ссылке один и используйте то глобалкибордхук.cs в вашем приложении.

  3. Затем в ссылках поместите следующее:

Использование Системы.Во время выполнения.InteropServices; / / Grabs для ваших библиотек DLL

С помощью утилит; / / захватывает из файла, добавленного в приложение.

  1. Теперь вы хотите разместить в своем классе следующий код:

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

  1. теперь идите вперед, делайте ваши нажатия клавиш, вы хотите, чтобы вас схватили это я найдено лучше всего в Form1_Loaded:

ГКХ.HookedKeys.Добавить (Ключи.A); / / это собирает ключ A.

ГКХ.HookedKeys.Добавить (Ключи.B);//это собирает ключ B.

ГКХ.HookedKeys.Добавить (Ключи.C);//это собирает ключ C.

ГКХ.KeyDown += new KeyEventHandler(gkh_KeyDown); / / событие для нажатия клавиши вниз.

ГКХ.KeyUp += new KeyEventHandler(gkh_KeyUp); / / событие для освобождения ключа.

  1. после этого вы захотите пойти вперед и разместить в следующем в ваш код также:

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;

}

  1. Как только это будет сделано, просто поместите этот маленький бит в 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

    Ничего не найдено.