Я сделал это уже пробовал: Как имитировать удержание клавиши на C++, и еще много разговоров.
Я написал это в Ржавчина изначально.
Код: Выделить всё
let mut keybd_flags = KEYEVENTF_SCANCODE;
let mut inserted_events = 0;
let mut expected_events = 1;
let mut input: INPUT = std::mem::zeroed();
let mut kbd_input: KEYBDINPUT = std::mem::zeroed();
kbd_input.wScan = scan_code as u16;
kbd_input.dwFlags = keybd_flags;
input.type_ = INPUT_KEYBOARD;
*input.u.ki_mut() = kbd_input;
let new_events = SendInput(1, std::ptr::addr_of_mut!(input), INPUT_SIZE);
inserted_events += new_events;
if inserted_events != expected_events {
return Err(Error::InputError(inserted_events as i32));
}
std::thread::sleep(std::time::Duration::from_millis(1));
Код: Выделить всё
unsafe { key_down("a").unwrap() }
sleep(3.0);
unsafe { key_up("a").unwrap() }
Именно тогда я наткнулся на это:
Код: Выделить всё
WCHAR key = 'a';
key = VkKeyScanW(key);
UINT mappedKey = MapVirtualKeyW(LOBYTE(key), NULL);
INPUT input = { 0 };
input.type = INPUT_KEYBOARD;
input.ki.dwFlags = KEYEVENTF_SCANCODE;
input.ki.wScan = mappedKey;
SendInput(1, &input, sizeof(input));
Sleep(2000);
input.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
SendInput(1, &input, sizeof(input));
Для контекста я пытаюсь чтобы скопировать функциональность из pydirectinput в ржавчину, которая следует за этой функциональностью. Тем не менее, keyDown на pydirectinput работает так, как задумано.
Так что я немного растерялся, и будьте полегче, я совершенно новичок в использовании WinAPI и по большей части я очищал код и все, что мог узнать от Google.
Подробнее здесь: https://stackoverflow.com/questions/793 ... down-a-key
Мобильная версия