{"id":840,"date":"2011-05-31T18:11:10","date_gmt":"2011-05-31T15:11:10","guid":{"rendered":"http:\/\/pblog.ru\/?p=840"},"modified":"2011-06-01T07:48:10","modified_gmt":"2011-06-01T04:48:10","slug":"rasshifrovka-skan-kodov-klavish","status":"publish","type":"post","link":"http:\/\/pblog.ru\/?p=840","title":{"rendered":"\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0441\u043a\u0430\u043d-\u043a\u043e\u0434\u043e\u0432 \u043a\u043b\u0430\u0432\u0438\u0448"},"content":{"rendered":"<p>\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439, \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c! \u0412 \u044d\u0442\u043e\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043a\u0430\u043d-\u043a\u043e\u0434\u044b \u043a\u043b\u0430\u0432\u0438\u0448 \u0432 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u0438 \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u043f\u043e \u0435\u0451 \u0441\u043a\u0430\u043d-\u043a\u043e\u0434\u0443. \u0415\u0441\u043b\u0438 \u0432\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0443\u0442\u044c \u0434\u0435\u043b\u0430, \u0442\u043e \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 GetKeyNameText \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 MapVirtualKey. \u0422\u043e, \u0447\u0442\u043e \u044f \u0437\u0434\u0435\u0441\u044c \u043e\u043f\u0438\u0448\u0443, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u0430\u043c \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f, \u0440\u0430\u0437\u0432\u0435 \u0447\u0442\u043e \u0432\u044b \u0441\u0430\u043c\u0438 \u043d\u0435 \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0443 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b. \u0422\u0430\u043a \u0436\u0435 \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 Delphi \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u043b\u043e\u0433\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0434\u0440\u0430\u0439\u0432\u0435\u0440-\u0444\u0438\u043b\u044c\u0442\u0440, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u0432 <a href=\"http:\/\/pblog.ru\/?p=810\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. <\/a><br \/>\n<!--more--><br \/>\n&nbsp;&nbsp;&nbsp;\u0418\u0442\u0430\u043a, \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430 \u0432\u044b\u0434\u0430\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0430\u043d-\u043a\u043e\u0434\u044b \u043a\u043b\u0430\u0432\u0438\u0448, \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u044f \u0441\u043a\u0430\u043d-\u043a\u043e\u0434\u043e\u0432 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u00ab[\u00bb \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0439 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u0439 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u0438\u043c\u0432\u043e\u043b \u00ab[\u00bb, \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0439 \u0440\u0443\u0441\u0441\u043a\u043e\u0439 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u0438\u043c\u0432\u043e\u043b \u00ab\u0445\u00bb. \u041d\u0430\u043c \u043d\u0430\u0434\u043e \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u044d\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435.<br \/>\n&nbsp;&nbsp;&nbsp;\u041d\u0435 \u0431\u0443\u0434\u0443 \u0434\u043e\u043b\u0433\u043e \u0440\u0430\u0437\u043c\u0443\u0441\u043e\u043b\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0442\u0435\u043c\u0443, \u0441\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443: \u0437\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043a\u0430\u043d-\u043a\u043e\u0434\u043e\u0432 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f DLL, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f DLL \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438. \u042d\u0442\u0438 DLL \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043f\u0430\u043f\u043a\u0435 Windows\\System32 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c kbd*.dll. \u0420\u0443\u0441\u0441\u043a\u0430\u044f \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 kbdru.dll, \u0430\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430\u044f \u0432 kbdus.dll, \u0442\u0430\u0442\u0430\u0440\u0441\u043a\u0430\u044f \u0432 kbdtat.dll \u0438 \u0442.\u0434.<br \/>\n&nbsp;&nbsp;&nbsp;DLL \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u043e\u043b\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u043a\u0430\u043d-\u043a\u043e\u0434\u043e\u0432, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e:<\/p>\n<ol>\n<li>\u0421\u043a\u0430\u043d-\u043a\u043e\u0434\u044b \u0432 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u0434\u044b<\/li>\n<li>\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u0432 \u0441\u043a\u0430\u043d-\u043a\u043e\u0434\u044b<\/li>\n<li>\u0421\u043a\u0430\u043d-\u043a\u043e\u0434\u044b \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0432\u0438\u0448<\/li>\n<li>\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u0432\u043e \u0444\u043b\u0430\u0433\u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b (SHIFT, CTRL \u0438 \u0442.\u0434.)<\/li>\n<li>\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b<\/li>\n<\/ol>\n<p>&nbsp;&nbsp;&nbsp;\u042d\u0442\u0438 DLL \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 GetKeyNameText \u0438 MapVirtualKey. \u041d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0438\u043a\u0442\u043e \u043d\u0430\u043c \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0432\u0435\u0434\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0435 DLL \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u0433\u0440\u0443\u0437\u0438\u0442\u044c.<br \/>\n\u041a\u0430\u0436\u0434\u0430\u044f DLL kbd*.dll \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 stdcall \u0444\u0443\u043d\u043a\u0446\u0438\u044e &#8212; KbdLayerDescriptor. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 KBDTABLES.<\/p>\n<pre><code>\r\ntypedef struct tagKbdLayer {\r\n    PMODIFIERS pCharModifiers;\r\n    PVK_TO_WCHAR_TABLE pVkToWcharTable;  \r\n    PDEADKEY pDeadKey;\r\n    PVSC_LPWSTR pKeyNames;\r\n    PVSC_LPWSTR pKeyNamesExt;\r\n    WCHAR *KBD_LONG_POINTER *KBD_LONG_POINTER pKeyNamesDead;\r\n\r\n    USHORT  *KBD_LONG_POINTER pusVSCtoVK;\r\n    BYTE    bMaxVSCtoVK;\r\n    PVSC_VK pVSCtoVK_E0;  \r\n    PVSC_VK pVSCtoVK_E1;  \r\n    DWORD fLocaleFlags;\r\n    BYTE       nLgMax;\r\n    BYTE       cbLgEntry;\r\n    PLIGATURE1 pLigature;\r\n#if (NTDDI_VERSION &gt;= NTDDI_WINXP)\r\n    DWORD      dwType;     \r\n    DWORD      dwSubType\r\n#endif\r\n} KBDTABLES, *KBD_LONG_POINTER PKBDTABLES;\r\n<\/code><\/pre>\n<p>&nbsp;&nbsp;&nbsp;\u0417\u0430\u0434\u0430\u0447\u0430 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043a\u0430\u043d-\u043a\u043e\u0434\u0430 \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f: \u043f\u043e\u043b\u0435 pusVSCtoVK \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u0441\u043a\u0430\u043d-\u043a\u043e\u0434\u0430, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u0440\u0430\u0432\u043d\u044b\u043c \u0441\u043a\u0430\u043d-\u043a\u043e\u0434\u0443. \u041d\u0430 Delphi \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043a\u043e\u0434\u043e\u043c:<\/p>\n<pre><code>\r\nfunction GetVirtualCodeFromScanCode(pKbdTable:PKBDTABLES; KeyScanCode:Word):Word;\r\nbegin\r\n  Result:= PWord(DWORD(pKbdTable^.pusVSCtoVK)+KeyScanCode*sizeof(Word))^;\r\nend;\r\n<\/code><\/pre>\n<p>&nbsp;&nbsp;&nbsp;\u0417\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043c\u0435\u043d\u0438 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u043f\u043e \u0435\u0451 \u0441\u043a\u0430\u043d-\u043a\u043e\u0434\u0443 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u043d\u043e \u043d\u0435 \u043d\u0430 \u043c\u043d\u043e\u0433\u043e. \u0414\u043b\u044f \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043a\u0430\u043d-\u043a\u043e\u0434\u0430 \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u0432\u0430 \u043f\u043e\u043b\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b KBDTABLES: pKeyNames \u0438 pKeyNamesExt. \u041e\u043d\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 VSC_LPWSTR.<\/p>\n<pre><code>\r\ntypedef struct {\r\n    BYTE   vsc;\r\n    WCHAR *KBD_LONG_POINTER pwsz;\r\n} VSC_LPWSTR, *KBD_LONG_POINTER PVSC_LPWSTR;\r\n<\/code><\/pre>\n<p>\u0433\u0434\u0435 vsc \u2013 \u0441\u043a\u0430\u043d-\u043a\u043e\u0434 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, pwsz \u2013 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 UNICODE \u0441\u0442\u0440\u043e\u043a\u0443, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0443\u044e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Enter, Backspace \u0438 \u0442.\u0434.).<br \/>\n&nbsp;&nbsp;&nbsp;\u041a\u0430\u0436\u0434\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u043f\u043e\u043b\u0435\u043c vsc \u0440\u0430\u0432\u043d\u044b\u043c \u043d\u0443\u043b\u044e. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043c\u0435\u043d\u0438 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e \u044d\u0442\u0438\u043c \u0434\u0432\u0443\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c. \u0414\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f:<\/p>\n<pre><code>\r\nfunction GetKeyNameW( pKbdTable: PKBDTABLES; KeyScanCode: word): PWChar;\r\nvar\r\n  pCurrItem:PVSC_LPWSTR;\r\nbegin\r\n  Result:=nil; \r\n  pCurrItem := pKbdTable^.pKeyNames;\r\n  while pCurrItem^.vsc0 do\r\n   begin\r\n    if pCurrItem^.vsc = KeyScanCode then\r\n     begin\r\n      Result:= pCurrItem^.pwsz;\r\n      exit;\r\n     end;\r\n    pCurrItem := PVSC_LPWSTR(DWORD(pCurrItem)+ sizeof(VSC_LPWSTR));\r\n   end;\r\n   \r\n  pCurrItem := pKbdTable^.pKeyNamesExt;\r\n  while pCurrItem^.vsc0 do\r\n   begin\r\n    if pCurrItem^.vsc = KeyScanCode then\r\n     begin\r\n      Result:= pCurrItem^.pwsz;\r\n      exit;\r\n     end;\r\n    pCurrItem := PVSC_LPWSTR(DWORD(pCurrItem) +sizeof(VSC_LPWSTR));\r\n   end;\r\nend;\r\n<\/code><\/pre>\n<p>&nbsp;&nbsp;&nbsp;\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u043e\u043e\u0440\u0443\u0436\u0438\u0432\u0448\u0438\u0441\u044c \u044d\u0442\u0438\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u043e\u0440\u0430\u043c\u043c\u0443 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u043b\u043e\u0433\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u043c-\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u043c \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430\u043c\u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<pre><code>\r\nvar\r\n  KeyPressed: array[0..6] of WCHAR = ('D', 'O', 'W', 'N', ' ', ':', ' ');\r\n  KeyReleased: array[0..4] of WCHAR = ('U', 'P', ' ', ':', ' ');\r\n  NewLine: array[0..1] of WCHAR = (#13, #10);\r\n\r\nprocedure TMainForm.ScanCodesToKeyNames(Buffer: PWord; BufferSize:DWORD; FileName:PChar);\r\nvar\r\n  KeyName : array[0..23] of WCHAR;\r\n  CurrKeyName: PWChar;\r\n  FileHandle:THandle;\r\n  _Writed:DWORD;\r\n  _i, _c:Integer;\r\n  cVK:Word;\r\nbegin\r\n  FileHandle:=CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);\r\n  if FileHandle=INVALID_HANDLE_VALUE then Exit;\r\n  _c:=BufferSize div sizeof(Word);\r\n  for _i:=1 to _c do\r\n   begin\r\n    if ((Buffer^ shr 8 ) and KEY_BREAK)=KEY_BREAK then\r\n     WriteFile(FileHandle, KeyReleased, SizeOf(KeyReleased), _Writed, 0)\r\n                                               else\r\n     WriteFile(FileHandle, KeyPressed, SizeOf(KeyPressed), _Writed, 0);\r\n\r\n    CurrKeyName:=GetKeyNameW(CurrentKBDTable, (Buffer^ and $FF));\r\n    if CurrKeyNamenil then\r\n      WriteFile(FileHandle, CurrKeyName^, lstrlenW(CurrKeyName)*2, _Writed, 0)\r\n                        else\r\n      begin\r\n        cVK:=GetVirtualCodeFromScanCode(CurrentKBDTable, Buffer^ and $FF);\r\n        WriteFile(FileHandle, cVK, SizeOf(cVK), _Writed, 0);\r\n      end;\r\n    WriteFile(FileHandle, NewLine, 4, _Writed, 0);\r\n    Inc(Buffer);\r\n   end;\r\n  CloseHandle(FileHandle); \r\nend;\r\n<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0440\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430: \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0431\u0443\u0444\u0435\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0437\u0430\u043a\u0440\u0443\u0436\u0435\u043d \u0444\u0430\u0439\u043b \u043b\u043e\u0433\u0430, \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u0438 \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0434\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0443. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432 \u0446\u0438\u043a\u043b\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043a\u0430\u043d-\u043a\u043e\u0434, \u0435\u0441\u043b\u0438 \u0443 \u0441\u043a\u0430\u043d-\u043a\u043e\u0434\u0430 \u043d\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 (\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d ASCII \u043a\u043e\u0434\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0430). \u0420\u0430\u0437\u043c\u0435\u0440 \u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u0440\u0430\u0432\u0435\u043d \u0434\u0432\u0443\u043c \u0431\u0430\u0439\u0442\u0430\u043c. \u0421\u0430\u043c \u0441\u043a\u0430\u043d-\u043a\u043e\u0434 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432 \u043c\u043b\u0430\u0434\u0448\u0435\u043c \u0431\u0430\u0439\u0442\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u0424\u043b\u0430\u0433, \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u0439 \u043e \u0442\u043e\u043c \u043d\u0430\u0436\u0430\u0442\u0430 \u0431\u044b\u043b\u0430 \u043a\u043b\u0430\u0432\u0438\u0448\u0430 \u0438\u043b\u0438 \u043e\u0442\u043f\u0443\u0449\u0435\u043d\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432 \u0441\u0442\u0430\u0440\u0448\u0435\u043c \u0431\u0430\u0439\u0442\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.<br \/>\n&nbsp;&nbsp;&nbsp;\u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415! \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0444\u0430\u0439\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u044e\u043d\u0438\u043a\u043e\u0434\u043e\u0432\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0430 \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f. \u0424\u0430\u0439\u043b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e UNICODE \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, EmEditor, NotePad++ \u0438 \u0442.\u0434.<br \/>\n&nbsp;&nbsp;&nbsp;\u0427\u0442\u043e \u0436\u0435 \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043a\u0430\u043d-\u043a\u043e\u0434\u043e\u0432 \u0432 \u0442\u0435\u043a\u0441\u0442, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0430\u0436\u0430\u0442\u044b\u0445 \u043a\u043b\u0430\u0432\u0438\u0448 \u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432\u043e \u0444\u043b\u0430\u0433\u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u0435\u0441\u043b\u0438 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0449\u0438\u043c\u0438 (SHIFT, CTRL \u0438 ALT). \u0417\u0430\u0434\u0430\u0447\u0443 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043a\u0430\u043d-\u043a\u043e\u0434\u043e\u0432 \u0432 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0432\u0430\u043c. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 kbd.h \u0438\u0437 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0430 WDK (\u0438\u043b\u0438 DDK).<br \/>\n<a href=\"http:\/\/pblog.ru\/wp-content\/uploads\/ScanCodesConverter.zip\">\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 \u0441\u043a\u0430\u043d-\u043a\u043e\u0434\u043e\u0432 \u0438 \u0435\u0451 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439, \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c! \u0412 \u044d\u0442\u043e\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043a\u0430\u043d-\u043a\u043e\u0434\u044b \u043a\u043b\u0430\u0432\u0438\u0448 \u0432 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u0438 \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u043f\u043e \u0435\u0451 \u0441\u043a\u0430\u043d-\u043a\u043e\u0434\u0443. \u0415\u0441\u043b\u0438 \u0432\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0443\u0442\u044c \u0434\u0435\u043b\u0430, \u0442\u043e \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 GetKeyNameText \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 MapVirtualKey. \u0422\u043e, \u0447\u0442\u043e \u044f \u0437\u0434\u0435\u0441\u044c \u043e\u043f\u0438\u0448\u0443, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u0430\u043c \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f, \u0440\u0430\u0437\u0432\u0435 \u0447\u0442\u043e \u0432\u044b \u0441\u0430\u043c\u0438 \u043d\u0435 \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[3,15],"tags":[421],"_links":{"self":[{"href":"http:\/\/pblog.ru\/index.php?rest_route=\/wp\/v2\/posts\/840"}],"collection":[{"href":"http:\/\/pblog.ru\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/pblog.ru\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/pblog.ru\/index.php?rest_route=\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"http:\/\/pblog.ru\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=840"}],"version-history":[{"count":14,"href":"http:\/\/pblog.ru\/index.php?rest_route=\/wp\/v2\/posts\/840\/revisions"}],"predecessor-version":[{"id":854,"href":"http:\/\/pblog.ru\/index.php?rest_route=\/wp\/v2\/posts\/840\/revisions\/854"}],"wp:attachment":[{"href":"http:\/\/pblog.ru\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=840"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/pblog.ru\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=840"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/pblog.ru\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=840"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}