非阻塞键盘输入 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 更好的解决方案。
我需要 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 更好的解决方案。