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