extgraph.pp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. unit extgraph;
  2. interface
  3. function readkey : char;
  4. function keypressed : boolean;
  5. procedure delay(ms : word);
  6. var
  7. directvideo : boolean;
  8. implementation
  9. uses
  10. windows,graph;
  11. const
  12. keybuffersize = 16;
  13. var
  14. keyboardhandling : TCriticalSection;
  15. keybuffer : array[1..keybuffersize] of char;
  16. nextfree,nexttoread : longint;
  17. procedure inccyclic(var i : longint);
  18. begin
  19. inc(i);
  20. if i>keybuffersize then
  21. i:=1;
  22. end;
  23. procedure addchar(c : char);
  24. begin
  25. EnterCriticalSection(keyboardhandling);
  26. keybuffer[nextfree]:=c;
  27. inccyclic(nextfree);
  28. { skip old chars }
  29. if nexttoread=nextfree then
  30. inccyclic(nexttoread);
  31. LeaveCriticalSection(keyboardhandling);
  32. end;
  33. function readkey : char;
  34. begin
  35. while true do
  36. begin
  37. EnterCriticalSection(keyboardhandling);
  38. if nexttoread<>nextfree then
  39. begin
  40. readkey:=keybuffer[nexttoread];
  41. inccyclic(nexttoread);
  42. LeaveCriticalSection(keyboardhandling);
  43. exit;
  44. end;
  45. LeaveCriticalSection(keyboardhandling);
  46. { give other threads a chance }
  47. Windows.Sleep(0);
  48. end;
  49. end;
  50. function keypressed : boolean;
  51. begin
  52. EnterCriticalSection(keyboardhandling);
  53. keypressed:=nexttoread<>nextfree;
  54. LeaveCriticalSection(keyboardhandling);
  55. end;
  56. procedure delay(ms : word);
  57. begin
  58. Sleep(ms);
  59. end;
  60. function msghandler(Window: hwnd; AMessage, WParam,
  61. LParam: Longint): Longint;
  62. begin
  63. case amessage of
  64. WM_CHAR:
  65. begin
  66. addchar(chr(wparam));
  67. writeln('got char message: ',wparam);
  68. end;
  69. WM_KEYDOWN:
  70. begin
  71. writeln('got key message');
  72. end;
  73. end;
  74. msghandler:=0;
  75. end;
  76. var
  77. oldexitproc : pointer;
  78. procedure myexitproc;
  79. begin
  80. exitproc:=oldexitproc;
  81. DeleteCriticalSection(keyboardhandling);
  82. end;
  83. begin
  84. charmessagehandler:=@msghandler;
  85. nextfree:=1;
  86. nexttoread:=1;
  87. InitializeCriticalSection(keyboardhandling);
  88. oldexitproc:=exitproc;
  89. exitproc:=@myexitproc;
  90. end.