`SendInput` Отправка только одного символа вместо удерживания клавиши [дубликат]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 `SendInput` Отправка только одного символа вместо удерживания клавиши [дубликат]

Сообщение Anonymous »

Когда я работал над проектом, мне нужно было иметь возможность удерживать клавишу, и я выбрал SendInput, поскольку он, по всей видимости, работает для игр DirectX.
Я сделал это уже пробовал: Как имитировать удержание клавиши на 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));
При этом клавиша будет нажата только один раз, не удерживая ее нажатой (как проверено в vscode и блокноте). Как показано ниже:

Код: Выделить всё

    unsafe { key_down("a").unwrap() }
sleep(3.0);
unsafe { key_up("a").unwrap() }
Поэтому я предположил, что с моим кодом возникла проблема, и решил поискать в Интернете что-нибудь на C++, которое выполняет ту же задачу, и протестировать с этим.
Именно тогда я наткнулся на это:

Код: Выделить всё

    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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»