Ура! У меня получилось!!!

Огромное спасибо В. А. Соковикову за перевод документации:
http://www.vsokovikov.narod.ru/New_MSDN_API/Console/ogl_con.htmБлагодаря ей, я написал процедуру, которая прекрасно заменяет собой crt'шные readkey и keypressed, ещё и мышь опрашивает:
Код: Выделить всё
uses windows;
// Опрос кнопок клавиатуры и мыши.
procedure ReadKeys(var KeyCode, ControlKeyState :byte);
{ Возвращаемые значения:
KeyCode - код нажатой кнопки:
0 - обычные (не управляющие) кнопки НЕ нажаты;
1..7 - кнопки мыши: 1-левая; 2-правая; 3-средняя; 4..7-прочие кнопки мыши;
8..255 - кнопки клавиатуры (Виртуальные коды клавиш)
ControlKeyState - состояние управляющих кнопок (побитно):
0 - Правая кнопка ALT нажата
1 - Левая кнопка ALT нажата
2 - Правая кнопка CTRL нажата
3 - Левая кнопка CTRL нажата
4 - Любая кнопка SHIFT нажата
5 - Индикатор NUM LOCK включён
6 - Индикатор SCROLL LOCK включён
7 - Индикатор CAPS LOCK включён }
const control_keys=[16..20,44,91..93,144,145,160..165]; //Коды управляющих и необрабатываемых кнопок
var ih:hwnd; // дескриптор ввода
n,w:dword; // число событий, состояние кнопок
IR:INPUT_RECORD; // буфер данных
begin {ReadKeys}
KeyCode:=0; ControlKeyState:=$FF;
ih:=GetStdHandle(STD_INPUT_HANDLE);
GetNumberOfConsoleInputEvents(ih,@n);
while n>0 do begin
ReadConsoleInput(ih,@IR,1,@w);
if IR.EventType = 1 then begin // Обработка событий клавиатуры
if not (IR.Event.KeyEvent.wVirtualKeyCode in control_keys) and IR.Event.KeyEvent.bKeyDown then begin
KeyCode:=IR.Event.KeyEvent.wVirtualKeyCode and $FF;
ControlKeyState:=IR.Event.KeyEvent.dwControlKeyState and $FF;
break;
end;
end else
if IR.EventType = 2 then begin // Обработка событий мыши
w := IR.Event.MouseEvent.dwButtonState and $7F;
while w>0 do begin
inc(KeyCode);
if odd(w) then break;
w := w shr 1;
end;
if KeyCode>0 then begin
ControlKeyState:=IR.Event.MouseEvent.dwControlKeyState and $FF;
break;
end;
end;
dec(n);
end; {while n>0}
if ControlKeyState=$FF then begin // Просмотр состояния управляющих кнопок
if GetKeyState(VK_RMENU) and $80 = 0 then ControlKeyState := ControlKeyState xor $01;
if GetKeyState(VK_LMENU) and $80 = 0 then ControlKeyState := ControlKeyState xor $02;
if GetKeyState(VK_RCONTROL) and $80 = 0 then ControlKeyState := ControlKeyState xor $04;
if GetKeyState(VK_LCONTROL) and $80 = 0 then ControlKeyState := ControlKeyState xor $08;
if GetKeyState(VK_SHIFT) and $80 = 0 then ControlKeyState := ControlKeyState xor $10;
if GetKeyState(VK_NUMLOCK) and $01 = 0 then ControlKeyState := ControlKeyState xor $20;
if GetKeyState(VK_SCROLL) and $01 = 0 then ControlKeyState := ControlKeyState xor $40;
if GetKeyState(VK_CAPITAL) and $01 = 0 then ControlKeyState := ControlKeyState xor $80;
end;
end; {ReadKeys}
SSerge писал(а):...Ибо нельзя с одним и тем же логическим устройством типа консоли работать так, чтобы флудить в него постоянным потоком символов и одновременно из него же читать.
Как оказалось, очень даже можно
