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

时间:2017-02-08 11:53:39

标签: windows assembly keyboard 64-bit stdin

我需要在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。

1 个答案:

答案 0 :(得分:0)

我设法以某种方式使用此函数解决我的特定问题

extern GetAsyncKeyState

它具有在按下键时返回给定值的选项或者自上次调用函数后按下它时的选项 - 所以我在程序开始时调用此函数一次,然后检查是否从那时起调用它。但是在使用这种方法时存在许多问题,所以我会检查其他人建议的那些,并且可能会发布更好的解决方案。