„SendInput“ sendet nur ein einzelnes Zeichen, anstatt eine Taste gedrückt zu halten [Duplikat]C++

Programme in C++. Entwicklerforum
Guest
 „SendInput“ sendet nur ein einzelnes Zeichen, anstatt eine Taste gedrückt zu halten [Duplikat]

Post by Guest »

Als ich an einem Projekt arbeitete, musste ich in der Lage sein, eine Taste gedrückt zu halten, und wählte SendInput, da es anscheinend für DirectX-Spiele funktioniert.
Das habe ich bereits ausprobiert: So simulieren Sie das Gedrückthalten einer Taste in C++, , und jede Menge Chatgpting.
Ich habe das geschrieben Rost ursprünglich.

Code: Select all

    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));
Dadurch würde eine Taste nur ein einziges Mal gedrückt und nicht tatsächlich gedrückt gehalten werden (wie in vscode und Notepad getestet). Wie unten gezeigt:

Code: Select all

    unsafe { key_down("a").unwrap() }
sleep(3.0);
unsafe { key_up("a").unwrap() }
Also ging ich davon aus, dass es ein Problem mit meinem Code gab, und beschloss, online nach etwas in C++ zu suchen, das die gleiche Aufgabe erfüllt, und damit zu testen.
Da bin ich auf Folgendes gestoßen:

Code: Select all

    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));
Aber ich stehe hier vor der gleichen Schwierigkeit, wo a nur ein einziges Mal gedrückt wird.
Für den Kontext versuche ich es um die Funktionalität von pydirectinput nach Rust zu kopieren, was dieser Funktionalität folgt. Dennoch funktioniert keyDown auf pydirectinput wie beabsichtigt.
Also ich bin ein wenig verloren, aber gehen Sie vorsichtig mit mir um, ich bin völlig neu in der Verwendung der WinAPI und Zum größten Teil habe ich Code und alles, was ich von Google lernen kann, durchforstet.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post