Консультация № 63390
20.11.2006, 14:11
0.00 руб.
0 4 3
Здравствуйте!
Пишу на FASMе для консоли WIN32(Win‘XP).
Не получается клавиатурный ввод - API функция ReadConsoleInput.
Кто знает - киньте примерчик пожалуйста.
А может быть для консольного режима есть и другие API функции
клавиатурного ввода?

С наилучшими пожеланиями, Кузнецов Андрей.

Обсуждение

Неизвестный
20.11.2006, 14:33
общий
это ответ
Здравствуйте, Andreir!

Консоль можно считать и как файл. Например:
...
buf rb 100‘буфер для чтения строки
blen dd 100
.bRead dd ?
...
invoke GetStdHandle,STD_INPUT_HANDLE
push eax
invoke SetConsoleMode,eax,ENABLE_LINE_INPUT or ENABLE_ECHO_INPUT or ENABLE_PROCESSED_INPUT
pop eax
invoke ReadFile,eax,buf,bLen,.bRead,NULL
mov eax,[.bRead]‘ чИСЛО СЧИТАННЫХ БАЙТОВ
Неизвестный
20.11.2006, 19:41
общий
это ответ
Приветствую, Andreir!
в приложении код, моя старая программа. Она без цензуры, так что постарайтесь не упасть в обморок. Но там как раз есть обработка ReadConsoleInput, насколько я помню всё работало.
Вообще суть такая, вызываем ReadConsoleInput, смотрим было ли событие KEY_EVENT, и если да - идём в нужное место в структуре INPUT_RECORD, берём код нажатой кнопки.
(ReadConsoleInput - более "сырой" ввод, а ReadConsole/ReadFile - более "причёсаный" ввод. Если надо ввести имя, то лучше причёсанный ввод, а если надо отловить Esc, enter то лучше сырой ввод - я так думаю)

Приложение:
.486 ; my asm win prog.model flat, stdcall ; now: 18:23:10includelib import32.libL equ <LARGE>include const.inc;@echo off;C:\TASM\BIN\TASM32.EXE /z /ml C:\TASM\V\v1.asm, C:\TASM\V\vcon.obj;cd C:\TASM\V;C:\TASM\BIN\tlink32.exe -Tpe -ap -c -x vcon.obj, vcon.exe, , , , ;****************;****************;****************;****************extrn GetStdHandle:PROCextrn ExitProcess:proc extrn MessageBoxA:procextrn WriteConsoleA:procextrn SetConsoleTitleA:procextrn SetConsoleTextAttribute:procextrn ReadConsoleA:procextrn GetNumberOfConsoleInputEvents:procextrn ReadConsoleInputA:procextrn SetConsoleCursorPosition:procextrn GetConsoleOutputCP:procextrn SetConsoleOutputCP:proc;extrn HeapCreate:proc;extrn SetConsoleCtrlHandler:proc;extrn GetCurrentProcessId:proc;extrn GetModuleHandleA:PROC;extrn WaitMessage:PROC;extrn AllocConsole:proc.data;heapp dd ? ; Heap Handleih dd ? ;for inputoh dd ? ;for outputnum dd ?nu2 dd ?tit db ‘BшЄ№ъшэр ъюэёюы ...‘,0hlp db ‘Выбран пункт "помощь" ‘,10,13,0opt1 db ‘Option #1 ‘,0opt2 db ‘Оптион №2 ‘,0cor dd 0buff dw 0 db 200v1 db 100 dup (0).code;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<main proc nearpush STD_OUTPUT_HANDLEcall GetStdHandlemov oh,eax ; get output handlepush STD_INPUT_HANDLEcall GetStdHandlemov ih,eax ;get input handlecall SetConsoleTitleA,offset tit ; change console titlemov num,0fhcall SetConsoleTextAttribute,oh,num ; set colors;----------------;call MessageBoxA,0,offset conin,offset v1,0choosecycle:call ReadConsoleInputA,ih,offset buff,1,offset nu2mov ax,buffcmp ax,KEY_EVENTjnz fur1mov al,byte ptr[buff+10]cmp al,1bh ;//////////////// variant 1 ‘esc‘jz quit1cmp al,41h ;//////////////// variant 2 ‘a‘jnz fur2call SetConsoleCursorPosition,oh,corjmp fur1fur2:cmp al,70h ;//////////////// variant 3 ‘f1‘jnz fur3call SetConsoleCursorPosition,oh,0mov num,25call WriteConsoleA,oh,offset hlp,num,offset num,0jmp fur1fur3:cmp al,71h ;//////////////// variant 4 ‘f2‘jnz fur4call SetConsoleCursorPosition,oh,0mov num,10call WriteConsoleA,oh,offset opt1,num,offset num,0call GetConsoleOutputCPmov num,eaxcall HS,num,offset v1mov num,9;mov al,10;mov [v1+9],alcall WriteConsoleA,oh,offset v1,num,offset num,0jmp fur1fur4:cmp al,72h ;//////////////// variant 5 ‘f3‘jnz fur5call SetConsoleCursorPosition,oh,0mov num,10call WriteConsoleA,oh,offset opt2,num,offset num,0jmp fur1fur5:mov num,eaxcall HS,num,offset v1mov num,10mov al,10mov [v1+9],alcall WriteConsoleA,oh,offset v1,num,offset num,0fur1:jmp choosecyclequit1:push 0call ExitProcessmain endp;+++++++++++++strcmp proc mov ecx,[esp+04] mov edx,[esp+08] push ebx xor eax,eax xor ebx,ebxa65: mov al,[ecx] mov bl,[edx] sub eax,ebx jne aA1 test bl,bl je aA1 mov al,[ecx+01] mov bl,[edx+01] sub eax,ebx jne aA1 test bl,bl je aA1 mov al,[ecx+02] mov bl,[edx+02] sub eax,ebx jne aA1 test bl,bl je aA1 mov al,[ecx+03] mov bl,[edx+03] sub eax,ebx jne aA1 add ecx,00000004 add edx,00000004 test bl,bl jne a65aA1: pop ebx retstrcmp endp;(((((((((((((((((((HS proc neararg @@num :dword, @@str :dworduses ebx mov eax,[@@num] mov ebx,[@@str] mov ecx,7@@1: mov edx,eax shr eax,4 and edx,0Fh cmp edx,0Ah jae @@2 add edx,‘0‘ jmp @@3@@2: add edx,‘A‘ - 0Ah@@3: mov byte ptr[ ebx + ecx],dl dec ecx jns @@1 mov byte ptr[ebx + 8],‘h‘ mov byte ptr[ebx + 9],0 retendp HSend main
Неизвестный
20.11.2006, 21:09
общий
это ответ
Здравствуйте, Andreir!
Код для масма скоментариями в приложении, я думаю "перевод" в синтаксис фасма не составит труда. Это программа с http://www.wasm.ru/article.php?article=1022007 . Там описано подробнее. Совет: берете Win32 Programmers Reference/Win32 SDK Reference (Хэлп по винапи-входит в SDK, поставляется с компиляторами си, дельфи, есть отдельно в интернете), поиск->Console Functions-получаете большой список функций с описаниями).
С Уважением, IceW0|f.


Приложение:
.386 .model flat, stdcall option casemap :none ; case sensitive ; ###################################################### include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib ; ###################################################### .data Msg1 db "Type something > " Msg2 db "You typed > " ConsoleTitle db ‘Input & Output‘,0 ; ###################################################### .code ; ###################################################### Main proc LOCAL InputBuffer[128] :BYTE ;буффер для ввода LOCAL hOutPut :DWORD ;хэндл для вывода LOCAL hInput :DWORD ;хэндл для ввода LOCAL lpszBuffer :DWORD ;адрес буфера LOCAL nRead :DWORD ;прочитано байт LOCAL nWriten :DWORD ;напечатано байт ;устанавливаем титл окна invoke SetConsoleTitle, addr ConsoleTitle ;получаем хэндл для вывода invoke GetStdHandle, STD_OUTPUT_HANDLE mov hOutPut, eax ;печатаем "Type something > " invoke WriteConsole, hOutPut, addr Msg1, 17, addr nWriten,NULL ;получаем хэндл для ввода invoke GetStdHandle,STD_INPUT_HANDLE mov hInput, eax ;вводим invoke ReadConsole, hInput, addr InputBuffer, 10, ADDR nRead, NULL ;печатаем "You typed > " invoke WriteConsole, hOutPut, addr Msg2, 12, addr nWriten, NULL ;печатаем то, что ввели invoke WriteConsole, hOutPut, addr InputBuffer, nRead, addr nWriten, NULL ;задержка, чтобы полюбоваться invoke Sleep, 2000d ;выход invoke ExitProcess,0 Main endp ; ###################################################### end Main
Неизвестный
22.11.2006, 17:00
общий
Мне нужно читать скан-коды клавиатуры,SHIFT-CTRL-ALT комбинации.Это API функция ReadConsoleInput или какая-другая.( Вiктор ) меня правильно понял.
Форма ответа