非阻塞键盘输入 x64 windows assembly / c++

Non-blocking keyboard input x64 windows assembly / c++

我需要 windows x64 程序集中的代码:

a) 以非阻塞方式从用户键盘(stdin)读取数据。

b) 检查是否有数据的方法让我知道我是否应该已经调用 readFile 或跳过此步骤

c) 修复我目前所做的实现

到目前为止,我尝试了 PeekNamedPipe 函数,但它似乎不起作用。这是我到目前为止的代码:

mov     rcx,        dword -10
sub     rsp,        28h
call    GetStdHandle
add     rsp,        28h
mov     [std_in_handle],        rax

sub     rsp,        30h
mov rcx, qword [std_in_handle]
mov rdx, qword 0
mov r8d, dword 0
mov r9, qword 0
mov qword [rsp+0x20],   bytes_available
mov qword [rsp+0x28],   0
call PeekNamedPipe
add     rsp,        30h

cmp dword [bytes_available],    dword 0
je  .skip_reading_input

sub     rsp,        28h
mov rcx, qword [std_in_handle]
mov rdx, qword input_char
mov r8d, dword 1
mov r9, qword BytesRead
mov qword [rsp+0x20], 0
call ReadFile
add     rsp,        28h

.skip_reading_input

问题是 bytes_available 中的值始终为 0,即使我在键盘上键入内容,所以总是跳过 readfile。

我设法使用此功能以某种方式解决了我的特定问题

外部 GetAsyncKeyState

它有选项 return 在按下键时或自上次调用该函数后按下键时给定值 - 所以我在程序开始时调用此函数一次,然后检查它是否从那时起就被调用了。但是,使用这种方法时会出现很多问题,所以我会尽快检查其他人建议的问题,也许 post 更好的解决方案。