123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836 |
- {
- $Id$
- Copyright (c) 2002 by Pierre Muller
- This unit implements an the hooks needed for the win32 graph unit.
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- ****************************************************************************
- }
- unit win32gr;
- interface
- procedure SetGraphHooks;
- procedure UnsetGraphHooks;
- implementation
- uses
- windows,
- drivers,
- graph;
- var
- InputHandle : Handle;
- StoredControlKeyState : longint;
- lastir : INPUT_RECORD;
- const
- StoredChar : boolean = false;
- const
- KeyToAsciiCode : array [0..255] of char =
- (
- { 00 } #0,
- { 01 VK_LBUTTON } #0,
- { 02 VK_RBUTTON } #0,
- { 03 VK_CANCEL } #0,
- { 04 VK_MBUTTON } #0,
- { 05 unassigned } #0,
- { 06 unassigned } #0,
- { 07 unassigned } #0,
- { 08 VK_BACK } #8,
- { 09 VK_TAB } #9,
- { 0A unassigned } #0,
- { 0B unassigned } #0,
- { 0C VK_CLEAR ?? } #0,
- { 0D VK_RETURN } #13,
- { 0E unassigned } #0,
- { 0F unassigned } #0,
- { 10 VK_SHIFT } #0,
- { 11 VK_CONTROL } #0,
- { 12 VK_MENU (Alt key) } #0,
- { 13 VK_PAUSE } #0,
- { 14 VK_CAPITAL (Caps Lock) } #0,
- { 15 Reserved for Kanji systems} #0,
- { 16 Reserved for Kanji systems} #0,
- { 17 Reserved for Kanji systems} #0,
- { 18 Reserved for Kanji systems} #0,
- { 19 Reserved for Kanji systems} #0,
- { 1A unassigned } #0,
- { 1B VK_ESCAPE } #27,
- { 1C Reserved for Kanji systems} #0,
- { 1D Reserved for Kanji systems} #0,
- { 1E Reserved for Kanji systems} #0,
- { 1F Reserved for Kanji systems} #0,
- { 20 VK_SPACE} ' ',
- { 21 VK_PRIOR (PgUp) } #0,
- { 22 VK_NEXT (PgDown) } #0,
- { 23 VK_END } #0,
- { 24 VK_HOME } #0,
- { 25 VK_LEFT } #0,
- { 26 VK_UP } #0,
- { 27 VK_RIGHT } #0,
- { 28 VK_DOWN } #0,
- { 29 VK_SELECT ??? } #0,
- { 2A OEM specific !! } #0,
- { 2B VK_EXECUTE } #0,
- { 2C VK_SNAPSHOT } #0,
- { 2D VK_INSERT } #0,
- { 2E VK_DELETE } #0,
- { 2F VK_HELP } #0,
- { 30 VK_0 '0' } '0',
- { 31 VK_1 '1' } '1',
- { 32 VK_2 '2' } '2',
- { 33 VK_3 '3' } '3',
- { 34 VK_4 '4' } '4',
- { 35 VK_5 '5' } '5',
- { 36 VK_6 '6' } '6',
- { 37 VK_7 '7' } '7',
- { 38 VK_8 '8' } '8',
- { 39 VK_9 '9' } '9',
- { 3A unassigned } #0,
- { 3B unassigned } #0,
- { 3C unassigned } #0,
- { 3D unassigned } #0,
- { 3E unassigned } #0,
- { 3F unassigned } #0,
- { 40 unassigned } #0,
- { 41 VK_A 'A' } 'A',
- { 42 VK_B 'B' } 'B',
- { 43 VK_C 'C' } 'C',
- { 44 VK_D 'D' } 'D',
- { 45 VK_E 'E' } 'E',
- { 46 VK_F 'F' } 'F',
- { 47 VK_G 'G' } 'G',
- { 48 VK_H 'H' } 'H',
- { 49 VK_I 'I' } 'I',
- { 4A VK_J 'J' } 'J',
- { 4B VK_K 'K' } 'K',
- { 4C VK_L 'L' } 'L',
- { 4D VK_M 'M' } 'M',
- { 4E VK_N 'N' } 'N',
- { 4F VK_O 'O' } 'O',
- { 50 VK_P 'P' } 'P',
- { 51 VK_Q 'Q' } 'Q',
- { 52 VK_R 'R' } 'R',
- { 53 VK_S 'S' } 'S',
- { 54 VK_T 'T' } 'T',
- { 55 VK_U 'U' } 'U',
- { 56 VK_V 'V' } 'V',
- { 57 VK_W 'W' } 'W',
- { 58 VK_X 'X' } 'X',
- { 59 VK_Y 'Y' } 'Y',
- { 5A VK_Z 'Z' } 'Z',
- { 5B unassigned } #0,
- { 5C unassigned } #0,
- { 5D unassigned } #0,
- { 5E unassigned } #0,
- { 5F unassigned } #0,
- { 60 VK_NUMPAD0 NumKeyPad '0' } '0',
- { 61 VK_NUMPAD1 NumKeyPad '1' } '1',
- { 62 VK_NUMPAD2 NumKeyPad '2' } '2',
- { 63 VK_NUMPAD3 NumKeyPad '3' } '3',
- { 64 VK_NUMPAD4 NumKeyPad '4' } '4',
- { 65 VK_NUMPAD5 NumKeyPad '5' } '5',
- { 66 VK_NUMPAD6 NumKeyPad '6' } '6',
- { 67 VK_NUMPAD7 NumKeyPad '7' } '7',
- { 68 VK_NUMPAD8 NumKeyPad '8' } '8',
- { 69 VK_NUMPAD9 NumKeyPad '9' } '9',
- { 6A VK_MULTIPLY } #0,
- { 6B VK_ADD } #0,
- { 6C VK_SEPARATOR } #0,
- { 6D VK_SUBSTRACT } #0,
- { 6E VK_DECIMAL } #0,
- { 6F VK_DIVIDE } #0,
- { 70 VK_F1 'F1' } #0,
- { 71 VK_F2 'F2' } #0,
- { 72 VK_F3 'F3' } #0,
- { 73 VK_F4 'F4' } #0,
- { 74 VK_F5 'F5' } #0,
- { 75 VK_F6 'F6' } #0,
- { 76 VK_F7 'F7' } #0,
- { 77 VK_F8 'F8' } #0,
- { 78 VK_F9 'F9' } #0,
- { 79 VK_F10 'F10' } #0,
- { 7A VK_F11 'F11' } #0,
- { 7B VK_F12 'F12' } #0,
- { 7C VK_F13 } #0,
- { 7D VK_F14 } #0,
- { 7E VK_F15 } #0,
- { 7F VK_F16 } #0,
- { 80 VK_F17 } #0,
- { 81 VK_F18 } #0,
- { 82 VK_F19 } #0,
- { 83 VK_F20 } #0,
- { 84 VK_F21 } #0,
- { 85 VK_F22 } #0,
- { 86 VK_F23 } #0,
- { 87 VK_F24 } #0,
- { 88 unassigned } #0,
- { 89 VK_NUMLOCK } #0,
- { 8A VK_SCROLL } #0,
- { 8B unassigned } #0,
- { 8C unassigned } #0,
- { 8D unassigned } #0,
- { 8E unassigned } #0,
- { 8F unassigned } #0,
- { 90 unassigned } #0,
- { 91 unassigned } #0,
- { 92 unassigned } #0,
- { 93 unassigned } #0,
- { 94 unassigned } #0,
- { 95 unassigned } #0,
- { 96 unassigned } #0,
- { 97 unassigned } #0,
- { 98 unassigned } #0,
- { 99 unassigned } #0,
- { 9A unassigned } #0,
- { 9B unassigned } #0,
- { 9C unassigned } #0,
- { 9D unassigned } #0,
- { 9E unassigned } #0,
- { 9F unassigned } #0,
- { A0 unassigned } #0,
- { A1 unassigned } #0,
- { A2 unassigned } #0,
- { A3 unassigned } #0,
- { A4 unassigned } #0,
- { A5 unassigned } #0,
- { A6 unassigned } #0,
- { A7 unassigned } #0,
- { A8 unassigned } #0,
- { A9 unassigned } #0,
- { AA unassigned } #0,
- { AB unassigned } #0,
- { AC unassigned } #0,
- { AD unassigned } #0,
- { AE unassigned } #0,
- { AF unassigned } #0,
- { B0 unassigned } #0,
- { B1 unassigned } #0,
- { B2 unassigned } #0,
- { B3 unassigned } #0,
- { B4 unassigned } #0,
- { B5 unassigned } #0,
- { B6 unassigned } #0,
- { B7 unassigned } #0,
- { B8 unassigned } #0,
- { B9 unassigned } #0,
- { BA OEM specific } #0,
- { BB OEM specific } #0,
- { BC OEM specific } #0,
- { BD OEM specific } #0,
- { BE OEM specific } #0,
- { BF OEM specific } #0,
- { C0 OEM specific } #0,
- { C1 unassigned } #0,
- { C2 unassigned } #0,
- { C3 unassigned } #0,
- { C4 unassigned } #0,
- { C5 unassigned } #0,
- { C6 unassigned } #0,
- { C7 unassigned } #0,
- { C8 unassigned } #0,
- { C9 unassigned } #0,
- { CA unassigned } #0,
- { CB unassigned } #0,
- { CC unassigned } #0,
- { CD unassigned } #0,
- { CE unassigned } #0,
- { CF unassigned } #0,
- { D0 unassigned } #0,
- { D1 unassigned } #0,
- { D2 unassigned } #0,
- { D3 unassigned } #0,
- { D4 unassigned } #0,
- { D5 unassigned } #0,
- { D6 unassigned } #0,
- { D7 unassigned } #0,
- { D8 unassigned } #0,
- { D9 unassigned } #0,
- { DA unassigned } #0,
- { DB OEM specific } #0,
- { DC OEM specific } #0,
- { DD OEM specific } #0,
- { DE OEM specific } #0,
- { DF OEM specific } #0,
- { E0 OEM specific } #0,
- { E1 OEM specific } #0,
- { E2 OEM specific } #0,
- { E3 OEM specific } #0,
- { E4 OEM specific } #0,
- { E5 unassigned } #0,
- { E6 OEM specific } #0,
- { E7 unassigned } #0,
- { E8 unassigned } #0,
- { E9 OEM specific } #0,
- { EA OEM specific } #0,
- { EB OEM specific } #0,
- { EC OEM specific } #0,
- { ED OEM specific } #0,
- { EE OEM specific } #0,
- { EF OEM specific } #0,
- { F0 OEM specific } #0,
- { F1 OEM specific } #0,
- { F2 OEM specific } #0,
- { F3 OEM specific } #0,
- { F4 OEM specific } #0,
- { F5 OEM specific } #0,
- { F6 unassigned } #0,
- { F7 unassigned } #0,
- { F8 unassigned } #0,
- { F9 unassigned } #0,
- { FA unassigned } #0,
- { FB unassigned } #0,
- { FC unassigned } #0,
- { FD unassigned } #0,
- { FE unassigned } #0,
- { FF unassigned } #0
- );
- KeyToQwertyScan : array [0..255] of byte =
- (
- { 00 } 0,
- { 01 VK_LBUTTON } 0,
- { 02 VK_RBUTTON } 0,
- { 03 VK_CANCEL } 0,
- { 04 VK_MBUTTON } 0,
- { 05 unassigned } 0,
- { 06 unassigned } 0,
- { 07 unassigned } 0,
- { 08 VK_BACK } $E,
- { 09 VK_TAB } $F,
- { 0A unassigned } 0,
- { 0B unassigned } 0,
- { 0C VK_CLEAR ?? } 0,
- { 0D VK_RETURN } $1C,
- { 0E unassigned } 0,
- { 0F unassigned } 0,
- { 10 VK_SHIFT } 0,
- { 11 VK_CONTROL } 0,
- { 12 VK_MENU (Alt key) } 0,
- { 13 VK_PAUSE } 0,
- { 14 VK_CAPITAL (Caps Lock) } 0,
- { 15 Reserved for Kanji systems} 0,
- { 16 Reserved for Kanji systems} 0,
- { 17 Reserved for Kanji systems} 0,
- { 18 Reserved for Kanji systems} 0,
- { 19 Reserved for Kanji systems} 0,
- { 1A unassigned } 0,
- { 1B VK_ESCAPE } $1,
- { 1C Reserved for Kanji systems} 0,
- { 1D Reserved for Kanji systems} 0,
- { 1E Reserved for Kanji systems} 0,
- { 1F Reserved for Kanji systems} 0,
- { 20 VK_SPACE} $39,
- { 21 VK_PRIOR (PgUp) } $49,
- { 22 VK_NEXT (PgDown) } $51,
- { 23 VK_END } $4F,
- { 24 VK_HOME } $47,
- { 25 VK_LEFT } $4B,
- { 26 VK_UP } $48,
- { 27 VK_RIGHT } $4D,
- { 28 VK_DOWN } $50,
- { 29 VK_SELECT ??? } 0,
- { 2A OEM specific !! } 0,
- { 2B VK_EXECUTE } 0,
- { 2C VK_SNAPSHOT } 0,
- { 2D VK_INSERT } $52,
- { 2E VK_DELETE } $53,
- { 2F VK_HELP } 0,
- { 30 VK_0 '0' } 11,
- { 31 VK_1 '1' } 2,
- { 32 VK_2 '2' } 3,
- { 33 VK_3 '3' } 4,
- { 34 VK_4 '4' } 5,
- { 35 VK_5 '5' } 6,
- { 36 VK_6 '6' } 7,
- { 37 VK_7 '7' } 8,
- { 38 VK_8 '8' } 9,
- { 39 VK_9 '9' } 10,
- { 3A unassigned } 0,
- { 3B unassigned } 0,
- { 3C unassigned } 0,
- { 3D unassigned } 0,
- { 3E unassigned } 0,
- { 3F unassigned } 0,
- { 40 unassigned } 0,
- { 41 VK_A 'A' } $1E,
- { 42 VK_B 'B' } $30,
- { 43 VK_C 'C' } $2E,
- { 44 VK_D 'D' } $20,
- { 45 VK_E 'E' } $12,
- { 46 VK_F 'F' } $21,
- { 47 VK_G 'G' } $22,
- { 48 VK_H 'H' } $23,
- { 49 VK_I 'I' } $17,
- { 4A VK_J 'J' } $24,
- { 4B VK_K 'K' } $25,
- { 4C VK_L 'L' } $26,
- { 4D VK_M 'M' } $32,
- { 4E VK_N 'N' } $31,
- { 4F VK_O 'O' } $18,
- { 50 VK_P 'P' } $19,
- { 51 VK_Q 'Q' } $10,
- { 52 VK_R 'R' } $13,
- { 53 VK_S 'S' } $1F,
- { 54 VK_T 'T' } $14,
- { 55 VK_U 'U' } $16,
- { 56 VK_V 'V' } $2F,
- { 57 VK_W 'W' } $11,
- { 58 VK_X 'X' } $2D,
- { 59 VK_Y 'Y' } $15,
- { 5A VK_Z 'Z' } $2C,
- { 5B unassigned } 0,
- { 5C unassigned } 0,
- { 5D unassigned } 0,
- { 5E unassigned } 0,
- { 5F unassigned } 0,
- { 60 VK_NUMPAD0 NumKeyPad '0' } 11,
- { 61 VK_NUMPAD1 NumKeyPad '1' } 2,
- { 62 VK_NUMPAD2 NumKeyPad '2' } 3,
- { 63 VK_NUMPAD3 NumKeyPad '3' } 4,
- { 64 VK_NUMPAD4 NumKeyPad '4' } 5,
- { 65 VK_NUMPAD5 NumKeyPad '5' } 6,
- { 66 VK_NUMPAD6 NumKeyPad '6' } 7,
- { 67 VK_NUMPAD7 NumKeyPad '7' } 8,
- { 68 VK_NUMPAD8 NumKeyPad '8' } 9,
- { 69 VK_NUMPAD9 NumKeyPad '9' } 10,
- { 6A VK_MULTIPLY } 0,
- { 6B VK_ADD } 0,
- { 6C VK_SEPARATOR } 0,
- { 6D VK_SUBSTRACT } 0,
- { 6E VK_DECIMAL } 0,
- { 6F VK_DIVIDE } 0,
- { 70 VK_F1 'F1' } $3B,
- { 71 VK_F2 'F2' } $3C,
- { 72 VK_F3 'F3' } $3D,
- { 73 VK_F4 'F4' } $3E,
- { 74 VK_F5 'F5' } $3F,
- { 75 VK_F6 'F6' } $40,
- { 76 VK_F7 'F7' } $41,
- { 77 VK_F8 'F8' } $42,
- { 78 VK_F9 'F9' } $43,
- { 79 VK_F10 'F10' } $44,
- { 7A VK_F11 'F11' } $57,
- { 7B VK_F12 'F12' } $58,
- { 7C VK_F13 } 0,
- { 7D VK_F14 } 0,
- { 7E VK_F15 } 0,
- { 7F VK_F16 } 0,
- { 80 VK_F17 } 0,
- { 81 VK_F18 } 0,
- { 82 VK_F19 } 0,
- { 83 VK_F20 } 0,
- { 84 VK_F21 } 0,
- { 85 VK_F22 } 0,
- { 86 VK_F23 } 0,
- { 87 VK_F24 } 0,
- { 88 unassigned } 0,
- { 89 VK_NUMLOCK } 0,
- { 8A VK_SCROLL } 0,
- { 8B unassigned } 0,
- { 8C unassigned } 0,
- { 8D unassigned } 0,
- { 8E unassigned } 0,
- { 8F unassigned } 0,
- { 90 unassigned } 0,
- { 91 unassigned } 0,
- { 92 unassigned } 0,
- { 93 unassigned } 0,
- { 94 unassigned } 0,
- { 95 unassigned } 0,
- { 96 unassigned } 0,
- { 97 unassigned } 0,
- { 98 unassigned } 0,
- { 99 unassigned } 0,
- { 9A unassigned } 0,
- { 9B unassigned } 0,
- { 9C unassigned } 0,
- { 9D unassigned } 0,
- { 9E unassigned } 0,
- { 9F unassigned } 0,
- { A0 unassigned } 0,
- { A1 unassigned } 0,
- { A2 unassigned } 0,
- { A3 unassigned } 0,
- { A4 unassigned } 0,
- { A5 unassigned } 0,
- { A6 unassigned } 0,
- { A7 unassigned } 0,
- { A8 unassigned } 0,
- { A9 unassigned } 0,
- { AA unassigned } 0,
- { AB unassigned } 0,
- { AC unassigned } 0,
- { AD unassigned } 0,
- { AE unassigned } 0,
- { AF unassigned } 0,
- { B0 unassigned } 0,
- { B1 unassigned } 0,
- { B2 unassigned } 0,
- { B3 unassigned } 0,
- { B4 unassigned } 0,
- { B5 unassigned } 0,
- { B6 unassigned } 0,
- { B7 unassigned } 0,
- { B8 unassigned } 0,
- { B9 unassigned } 0,
- { BA OEM specific } 0,
- { BB OEM specific } 0,
- { BC OEM specific } 0,
- { BD OEM specific } 0,
- { BE OEM specific } 0,
- { BF OEM specific } 0,
- { C0 OEM specific } 0,
- { C1 unassigned } 0,
- { C2 unassigned } 0,
- { C3 unassigned } 0,
- { C4 unassigned } 0,
- { C5 unassigned } 0,
- { C6 unassigned } 0,
- { C7 unassigned } 0,
- { C8 unassigned } 0,
- { C9 unassigned } 0,
- { CA unassigned } 0,
- { CB unassigned } 0,
- { CC unassigned } 0,
- { CD unassigned } 0,
- { CE unassigned } 0,
- { CF unassigned } 0,
- { D0 unassigned } 0,
- { D1 unassigned } 0,
- { D2 unassigned } 0,
- { D3 unassigned } 0,
- { D4 unassigned } 0,
- { D5 unassigned } 0,
- { D6 unassigned } 0,
- { D7 unassigned } 0,
- { D8 unassigned } 0,
- { D9 unassigned } 0,
- { DA unassigned } 0,
- { DB OEM specific } 0,
- { DC OEM specific } 0,
- { DD OEM specific } 0,
- { DE OEM specific } 0,
- { DF OEM specific } 0,
- { E0 OEM specific } 0,
- { E1 OEM specific } 0,
- { E2 OEM specific } 0,
- { E3 OEM specific } 0,
- { E4 OEM specific } 0,
- { E5 unassigned } 0,
- { E6 OEM specific } 0,
- { E7 unassigned } 0,
- { E8 unassigned } 0,
- { E9 OEM specific } 0,
- { EA OEM specific } 0,
- { EB OEM specific } 0,
- { EC OEM specific } 0,
- { ED OEM specific } 0,
- { EE OEM specific } 0,
- { EF OEM specific } 0,
- { F0 OEM specific } 0,
- { F1 OEM specific } 0,
- { F2 OEM specific } 0,
- { F3 OEM specific } 0,
- { F4 OEM specific } 0,
- { F5 OEM specific } 0,
- { F6 unassigned } 0,
- { F7 unassigned } 0,
- { F8 unassigned } 0,
- { F9 unassigned } 0,
- { FA unassigned } 0,
- { FB unassigned } 0,
- { FC unassigned } 0,
- { FD unassigned } 0,
- { FE unassigned } 0,
- { FF unassigned } 0
- );
- { this procedure allows to hook keyboard messages }
- function fvisioncharmessagehandler (Window: hwnd; AMessage, WParam,
- LParam: Longint): Longint;
- var
- ir : INPUT_RECORD;
- NumWritten : dword;
- vKey : byte;
- scancode : integer;
- ach, ch : array[0..1] of char;
- IsExtended : boolean;
- begin
- fvisioncharmessagehandler:=0;
- if (AMessage = WM_CHAR) or (AMessage = WM_SYSCHAR) then
- begin
- if StoredChar then
- begin
- ach[0]:=chr(wparam and $ff);
- ach[1]:=#0;
- CharToOem(@ach,@ch);
- {$ifdef DEBUG}
- Write('key ',hexstr(lastir.Event.KeyEvent.wVirtualKeyCode,2));
- Write(' scan ',hexstr(lastir.Event.KeyEvent.wVirtualScanCode,2));
- if lastir.Event.KeyEvent.bKeyDown then
- writeln(' pressed')
- else
- writeln(' released');
- Writeln('char ',ach[0],'(',ch[0],')',' $',hexstr(wparam,2));
- {$endif DEBUG}
- Lastir.Event.KeyEvent.AsciiChar:=ch[0];
- WriteConsoleInput(InputHandle,lastir,1,NumWritten);
- StoredChar:=false;
- end
- else
- begin
- {$ifdef DEBUG}
- Writeln('char ',chr(wparam and $ff),' $',hexstr(wparam,2),' ignored');
- {$endif DEBUG}
- ach[0]:=chr(wparam and $ff);
- ach[1]:=#0;
- CharToOem(@ach,@ch);
- {$ifdef DEBUG}
- Write('key ',hexstr(lastir.Event.KeyEvent.wVirtualKeyCode,2));
- Write(' scan ',hexstr(lastir.Event.KeyEvent.wVirtualScanCode,2));
- if lastir.Event.KeyEvent.bKeyDown then
- writeln(' pressed')
- else
- writeln(' released');
- Writeln('char ',ach[0],'(',ch[0],')',' $',hexstr(wparam,2));
- {$endif DEBUG}
- Lastir.Event.KeyEvent.AsciiChar:=ch[0];
- WriteConsoleInput(InputHandle,lastir,1,NumWritten);
- StoredChar:=false;
- end;
- exit;
- end;
- if StoredChar then
- begin
- {$ifdef DEBUG}
- Write('key ',hexstr(lastir.Event.KeyEvent.wVirtualKeyCode,2));
- Write(' scan ',hexstr(lastir.Event.KeyEvent.wVirtualScanCode,2));
- if lastir.Event.KeyEvent.bKeyDown then
- writeln(' pressed')
- else
- writeln(' released');
- Writeln('char ',ach[0],'(',ch[0],')',' $',hexstr(wparam,2));
- {$endif DEBUG}
- WriteConsoleInput(InputHandle,lastir,1,NumWritten);
- StoredChar:=false;
- end;
- fillchar(ir,sizeof(ir),#0);
- ir.EventType:=KEY_EVENT;
- with ir.Event.KeyEvent do
- begin
- vKey:=WParam and $ff;
- wRepeatCount:=lparam and $ffff;
- IsExtended:=(lParam and (1 shl 24))<>0;
- if (AMessage = WM_KEYDOWN) or (AMessage = WM_SYSKEYDOWN) then
- bKeyDown:=true;
- wVirtualKeyCode:=vKey;
- AsciiChar:=KeyToAsciiCode[vKey];
- if AsciiChar<>#0 then
- begin
- { Use lower chars }
- if ((StoredControlKeyState and SHIFT_PRESSED)=0) and
- ((wVirtualKeyCode>=VK_A) and (wVirtualKeyCode<=VK_Z)) then
- AsciiChar:=chr(ord(AsciiChar) + ord('a')-ord('A'));
- if bKeyDown then
- StoredChar:=true;
- end;
- scancode:=KeyToQwertyScan[vKey];
- if scancode>0 then
- wVirtualScanCode:=scancode;
- case vKey of
- VK_SHIFT :
- if bKeyDown then
- StoredControlKeyState:= StoredControlKeyState or SHIFT_PRESSED
- else
- StoredControlKeyState:= StoredControlKeyState and not SHIFT_PRESSED;
- VK_CONTROL :
- begin
- if IsExtended then
- begin
- if bKeyDown then
- StoredControlKeyState:= StoredControlKeyState or RIGHT_CTRL_PRESSED
- else
- StoredControlKeyState:= StoredControlKeyState and not RIGHT_CTRL_PRESSED;
- end
- else if bKeyDown then
- StoredControlKeyState:= StoredControlKeyState or LEFT_CTRL_PRESSED
- else
- StoredControlKeyState:= StoredControlKeyState and not LEFT_CTRL_PRESSED;
- end;
- VK_MENU :
- begin
- if IsExtended then
- begin
- if bKeyDown then
- StoredControlKeyState:= StoredControlKeyState or RIGHT_ALT_PRESSED
- else
- StoredControlKeyState:= StoredControlKeyState and not RIGHT_ALT_PRESSED;
- end
- else if bKeyDown then
- StoredControlKeyState:= StoredControlKeyState or LEFT_ALT_PRESSED
- else
- StoredControlKeyState:= StoredControlKeyState and not LEFT_ALT_PRESSED;
- end;
- end;
- dwControlKeyState:=StoredControlKeyState;
- end;
- if not StoredChar then
- begin
- {$ifdef DEBUG}
- Write('key ',hexstr(ir.Event.KeyEvent.wVirtualKeyCode,2));
- Write(' scan ',hexstr(ir.Event.KeyEvent.wVirtualScanCode,2));
- if ir.Event.KeyEvent.bKeyDown then
- writeln(' pressed')
- else
- writeln(' released');
- {$endif DEBUG}
- WriteConsoleInput(InputHandle,ir,1,NumWritten);
- { still copy for use for special keys not registered }
- Lastir:=ir;
- end
- else
- Lastir:=ir;
- end;
- { this procedure allows to hook mouse messages }
- function fvisionmousemessagehandler (Window: hwnd; AMessage, WParam,
- LParam: Longint): Longint;
- var
- ir : INPUT_RECORD;
- NumWritten : dword;
- begin
- fvisionmousemessagehandler:=0;
- ir.EventType:=_MOUSE_EVENT;
- with ir.Event.MouseEvent do
- begin
- dwMousePosition.x:=loword(LParam) div SysFontWidth;
- dwMousePosition.y:=hiword(LParam) div SysFontHeight;
- dwButtonState:=0;
- if (wParam and MK_LBUTTON)<>0 then
- dwButtonState:=dwButtonState or FROM_LEFT_1ST_BUTTON_PRESSED;
- if (wParam and MK_MBUTTON)<>0 then
- dwButtonState:=dwButtonState or FROM_LEFT_2ND_BUTTON_PRESSED;
- if (wParam and MK_RBUTTON)<>0 then
- dwButtonState:=dwButtonState or RIGHTMOST_BUTTON_PRESSED;
- end;
- WriteConsoleInput(InputHandle,ir,1,NumWritten);
- end;
- {$ifdef USE_NEW_WNDPROC}
- Const
- PreviousWindowProc: WndProc = nil;
- function FvisionWindowProc(Window: HWnd; AMessage, WParam,
- LParam: Longint): Longint; stdcall; export;
- begin
- case AMessage of
- wm_lbuttondown,
- wm_rbuttondown,
- wm_mbuttondown,
- wm_lbuttonup,
- wm_rbuttonup,
- wm_mbuttonup,
- wm_lbuttondblclk,
- wm_rbuttondblclk,
- wm_mbuttondblclk:
- {
- This leads to problem, i.e. the menu etc doesn't work any longer
- wm_nclbuttondown,
- wm_ncrbuttondown,
- wm_ncmbuttondown,
- wm_nclbuttonup,
- wm_ncrbuttonup,
- wm_ncmbuttonup,
- wm_nclbuttondblclk,
- wm_ncrbuttondblclk,
- wm_ncmbuttondblclk:
- }
- { if assigned(mousemessagehandler) then }
- FvisionWindowProc:=mousemessagehandler(window,amessage,wparam,lparam);
- wm_keydown,
- wm_keyup,
- wm_syskeydown,
- wm_syskeyup,
- wm_syschar,
- wm_char:
- { if assigned(charmessagehandler) then }
- FvisionWindowProc:=charmessagehandler(window,amessage,wparam,lparam);
- else
- FvisionWindowProc:= CallWindowProc(PreviousWindowProc,Window,AMessage,WParam,LParam);
- end;
- end;
- {$endif USE_NEW_WNDPROC}
- procedure SetGraphHooks;
- begin
- {$ifdef USE_NEW_WNDPROC}
- If not assigned (PreviousWindowProc) then
- PreviousWindowProc:=WndProc(SetWindowLong(MainWindow,GWL_WNDPROC, longint(@fvisionWindowProc)));
- {$else not USE_NEW_WNDPROC}
- mousemessagehandler:=@fvisionmousemessagehandler;
- charmessagehandler:=@fvisioncharmessagehandler;
- {$endif USE_NEW_WNDPROC}
- InputHandle:=GetStdHandle(STD_INPUT_HANDLE);
- end;
- procedure UnsetGraphHooks;
- begin
- mousemessagehandler:=nil;
- charmessagehandler:=nil;
- {$ifdef USE_NEW_WNDPROC}
- SetWindowLong(MainWindow,GWL_WNDPROC, longint(PreviousWindowProc));
- PreviousWindowProc:=nil;
- {$endif USE_NEW_WNDPROC}
- InputHandle:=UnusedHandle;
- StoredControlKeyState:=0;
- end;
- end.
- {
- $Log$
- Revision 1.6 2003-01-12 23:25:51 pierre
- * fix win32 graph version compilation failure
- Revision 1.5 2002/05/31 13:35:33 pierre
- * recognize Enter key with kbEnter
- Revision 1.4 2002/05/29 21:20:49 pierre
- * better key translations
- Revision 1.3 2002/05/29 19:34:27 pierre
- * fix other keys
- Revision 1.2 2002/05/28 19:12:26 pierre
- * fix fvisioncharmessage
- Revision 1.1 2002/05/24 09:35:20 pierre
- first commit, not fully functional yet
- }
|