Мне нужна код в сборке Windows x64, который будет либо:неблокируемого ввод клавиатуры x64 окно сборка/C++
а) Прочитайте данные пользователя клавиатуры (стандартный ввод) в не блокирующем пути.
б) способ проверить, если есть данные, так что я знаю, если я должен вызывать ReadFile уже или пропустить этот шаг
с) Фикс для реализации я сделал до сих пор
До сих пор я попытался функция 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 всегда пропускаются.
Для подсистемы Console вы можете использовать [GetNumberOfConsoleInputEvents] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms683207 (v = vs.85) .aspx) или [PeekConsoleInput] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms684344(v=vs.85).aspx). Для подсистемы Windows будет использоваться обычная парадигма, управляемая сообщениями. –
Если это соответствует вашим потребностям, вы, вероятно, лучше всего открываете дескриптор 'CON', а не используете stdin. Таким образом, вы * знаете * это консольное устройство и можете использовать функции консоли. Если вы * имеете * для использования stdin, первое, что вам нужно сделать, это выяснить, какой дескриптор это, т. Е. Это консоль, труба или файл и вести себя соответственно. Или используйте потоки. –