【问题标题】:Non-blocking keyboard input x64 windows assembly / c++非阻塞键盘输入 x64 windows 程序集/c++
【发布时间】:2017-02-08 11:53:38
【问题描述】:

我需要 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 总是被跳过。

【问题讨论】:

  • 对于控制台子系统,您可以使用GetNumberOfConsoleInputEventsPeekConsoleInput。对于 Windows 子系统,通常的消息驱动范例就可以了。
  • 如果它满足您的需求,您最好明确打开CON 的句柄,而不是使用标准输入。这样,您知道它是一个控制台设备并且可以使用控制台功能。如果你不得不使用stdin,你需要做的第一件事就是弄清楚它是什么类型的句柄,即它是一个控制台、一个管道还是一个文件,并做出相应的行为。或者使用线程。

标签: windows assembly keyboard 64-bit stdin


【解决方案1】:

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

extern GetAsyncKeyState

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

【讨论】:

    猜你喜欢
    • 2010-10-01
    • 1970-01-01
    • 2012-03-14
    • 2011-01-16
    • 1970-01-01
    • 2020-03-29
    • 2016-08-10
    • 2016-07-04
    相关资源
    最近更新 更多