Intereting Posts
WinForms Control – действие после полной инициализации как создать пользовательский токен в sitecore Нужно регулярное выражение, чтобы удалить tags Name из строки Преобразование объекта String или Char в Keys Как сделать окно, в котором нет движения заголовка Ошибка чтения JObject из JsonReader. Текущий элемент JsonReader не является объектом: StartArray. Дорожка Entity Framework C # Вставка данных Проблемы с русской кодировкой printdocument добавляет пустую страницу Вызов функции C # из C ++ DLL Задача сценария SSIS Получить имена файлов и сохранить их в переменной объекта SSIS Почему я получаю эту ошибку компиляции, пытаясь вызвать базовый конструктор / метод, который принимает динамический аргумент? WatiN: The CurrentThread должен иметь свой ApartmentState для ApartmentState.STA, чтобы иметь возможность автоматизировать Internet Explorer Несколько настраиваемых методов FileSystemWatcher ASP.NET MVC: проверка подключения к базе данных при запуске приложения Как вручную установить первичный ключ сущности в первой базе данных кода Entity Framework?

Как имитировать удерживаемые клавиши с помощью VB.NET или C #?

Как я могу отправить ключи в другое приложение, чтобы они были сдержаны? Я хочу что-то вроде

keystate(keys.A) = down (удерживать кнопку)

а также

keystate(keys.A) = up (чтобы отпустить кнопку)

  • я не забочусь, если его c # или визуальный базовый я знаю их
  • использование визуальной студии

Если вы хотите отправить несколько ключей в строке, используйте SendKeys.Send

https://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send(v=vs.110).aspx

Если вы хотите удерживать клавиши, вам необходимо импортировать вызов библиотеки User32:

 Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer) 

Вам также понадобится MapVirtualKey. Это переносит расположение клавиш на вашей физической доске (ориентированной на водителя) на виртуальный набор клавиш, который является инвариантом аппаратного обеспечения (ориентированного на программное обеспечение).

  _ Public Shared Function MapVirtualKey(ByVal uCode As UInt32, ByVal uMapType As MapVirtualKeyMapTypes) As UInt32 End Function 

Тогда просто сделайте что-нибудь вроде этого:

 Private Sub HoldKeyDown(ByVal key As Byte, ByVal durationInSeconds As Integer) Dim targetTime As DateTime = DateTime.Now().AddSeconds(durationInSeconds) keybd_event(key, MapVirtualKey(key, 0), 0, 0) ' Down While targetTime.Subtract(DateTime.Now()).TotalSeconds > 0 Application.DoEvents() End While keybd_event(key, MapVirtualKey(key, 0), 2, 0) ' Up End Sub 

Вот простая форма, которая будет перемещать автомобиль вокруг формы на основе клавиш слева / справа / вверх / вниз, нажатых на клавиатуре. Я установил цикл обновления игры до 30 кадров в секунду, но вы можете изменить это, используя другой Thread.Sleep ():

есть ярлык в моей форме под названием lblCar, который я перемещаю в каждом цикле обновления игры.

 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { ThreadPool.QueueUserWorkItem(new WaitCallback(GameUpdate)); } private bool leftPressed; private bool rightPressed; private bool upPressed; private bool downPressed; private void GameUpdate(object state) { bool gameRunning = true; do { if (leftPressed) { BeginInvoke(new Action(() => { lblCar.Location = new Point(lblCar.Location.X - 1, lblCar.Location.Y); })); } if (rightPressed) { BeginInvoke(new Action(() => { lblCar.Location = new Point(lblCar.Location.X + 1, lblCar.Location.Y); })); } if (upPressed) { BeginInvoke(new Action(() => { lblCar.Location = new Point(lblCar.Location.X, lblCar.Location.Y - 1); })); } if (downPressed) { BeginInvoke(new Action(() => { lblCar.Location = new Point(lblCar.Location.X, lblCar.Location.Y + 1); })); } Thread.Sleep(33); // 30 frames per second } while (gameRunning); } private void Form1_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.Left: leftPressed = true; break; case Keys.Right: rightPressed = true; break; case Keys.Up: upPressed = true; break; case Keys.Down: downPressed = true; break; default: break; } } private void Form1_KeyUp(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.Left: leftPressed = false; break; case Keys.Right: rightPressed = false; break; case Keys.Up: upPressed = false; break; case Keys.Down: downPressed = false; break; default: break; } } } 

(визуальная студия), код

 Imports System.Runtime.InteropServices Public Class Form1 Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer) Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click End Sub  _ Public Shared Function MapVirtualKey(ByVal uCode As UInt32, ByVal uMapType As UInt32) As UInt32 End Function Private Sub HoldKeyDown(ByVal key As Byte, ByVal durationInSeconds As Integer) Dim targetTime As DateTime = DateTime.Now().AddSeconds(durationInSeconds) keybd_event(key, MapVirtualKey(key, 0), 0, 0) ' Down While targetTime.Subtract(DateTime.Now()).TotalSeconds > 0 Application.DoEvents() End While keybd_event(key, MapVirtualKey(key, 0), 2, 0) ' Up End Sub Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick HoldKeyDown(Keys.A, 5) End Sub End Class