2017-02-08 3 views
0

Мне нужна код в сборке 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 всегда пропускаются.

+0

Для подсистемы 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 будет использоваться обычная парадигма, управляемая сообщениями. –

+0

Если это соответствует вашим потребностям, вы, вероятно, лучше всего открываете дескриптор 'CON', а не используете stdin. Таким образом, вы * знаете * это консольное устройство и можете использовать функции консоли. Если вы * имеете * для использования stdin, первое, что вам нужно сделать, это выяснить, какой дескриптор это, т. Е. Это консоль, труба или файл и вести себя соответственно. Или используйте потоки. –

ответ

0

мне удалось каким-то образом решить мою особую проблему с помощью этой функции

ехЬегп GetAsyncKeyState

имеет опции для возвращения заданного значения при нажатии кнопки или когда она была нажата с момента последнего вызова функции - так Я вызываю эту функцию один раз в начале программы, а затем проверяю, была ли она вызвана с этого времени. Однако при использовании этого подхода существует ряд проблем, поэтому я проверю те, которые другие предложили в ближайшее время, и, возможно, опубликует лучшее решение.

Смежные вопросы