описание в масме: Код (Text): KEY_EVENT_RECORD STRUCT bKeyDown DWORD ? wRepeatCount WORD ? wVirtualKeyCode WORD ? wVirtualScanCode WORD ? UNION UnicodeChar WORD ? AsciiChar BYTE ? ENDS dwControlKeyState DWORD ? KEY_EVENT_RECORD ENDS в МСДН: Код (Text): typedef struct _KEY_EVENT_RECORD { BOOL bKeyDown; WORD wRepeatCount; WORD wVirtualKeyCode; WORD wVirtualScanCode; union { WCHAR UnicodeChar; CHAR AsciiChar; } uChar; DWORD dwControlKeyState; } KEY_EVENT_RECORD; на практике же в начале структуры у меня какие-то непознанные 2 байта пофиксил: Код (Text): KEY_EVENT_RECORD STRUCT xx word ? bKeyDown DWORD ? wRepeatCount WORD ? wVirtualKeyCode WORD ? wVirtualScanCode WORD ? UNION UnicodeChar WORD ? AsciiChar BYTE ? ENDS dwControlKeyState DWORD ? KEY_EVENT_RECORD ENDS работает... З.Ы. может это просто 2 часа ночи?
а да, код чуть не забыл: Код (Text): .386 .model flat,stdcall option casemap:none include windows.inc include kernel32.inc include user32.inc includelib kernel32.lib includelib user32.lib include d:\masm32\macros\macros.asm .const .data? buflen equ 255 buf db buflen dup (?) hStdIn dd ? hStdOut dd ? ir INPUT_RECORD <> .data .code start: invoke AllocConsole invoke GetStdHandle,STD_INPUT_HANDLE mov hStdIn,eax invoke GetStdHandle,STD_OUTPUT_HANDLE mov hStdOut,eax .while TRUE invoke ReadConsoleInput,hStdIn,offset ir,1,offset buf .if ir.EventType==KEY_EVENT .if ir.KeyEvent.bKeyDown==1 .if ir.KeyEvent.wVirtualKeyCode==VK_CONTROL invoke MessageBox,0,0,0,0 .endif .endif .endif .endw invoke FreeConsole invoke ExitProcess,0 end start
rain Во-первых buflen equ 255 - лучше buflen equ 256 для кратности Во-вторых: на практике же в начале структуры у меня какие-то непознанные 2 байта - Это наверно INPUT_RECORD.EventType (см. INPUT_RECORD в SDK)
ЗЫ: Такую программульку я бы писал в MSVC++ - не вижу смысла писать на MASM32, размер и скорость были бы такими же
2vasil нет, это не EventType, EventType идёт как-раз перед, попробуй откомпилить экзампл если не вылезет массадж бокс то открой дебаггером и глянь кстати в MOUSE_EVENT_RECORD то-же самое, я непойму я вроде не пил сёдня сильно много, а вообще вопрос не в том на чём писать, это ваще-то лабара в которой нада выполнить конкретную задачу на конкретном языке
rain ты на масме программишь, вот и использую правила масма и обращайся к структурам как это принято в масме, тогда не будет возникать непонятных глюков
так. причём тут u? по той ссылке что ты дал u это имя юниона вне структуры, если юнион в структуре то у него нет имени (есть только имена переменных структур, что он содержит), обращаться к нему можно (и никак иначе? - всмысле с-вами масма) только как я сделал это выше. ir.u.KeyEvent в данном случае бред, ведь нету в структуре INPUT_RECORD такой переменной: Код (Text): INPUT_RECORD STRUCT EventType WORD ? UNION KeyEvent KEY_EVENT_RECORD <> MouseEvent MOUSE_EVENT_RECORD <> WindowBufferSizeEvent WINDOW_BUFFER_SIZE_RECORD <> MenuEvent MENU_EVENT_RECORD <> FocusEvent FOCUS_EVENT_RECORD <> ENDS INPUT_RECORD ENDS люди! пожалуйста обратите кто-то внимание и помогите разобраться втф
KEY_EVENT_RECORD объявлена правильно, т.к. это упакованная структура с "ручным" выравниванием на 2 байта. А вот INPUT_RECORD - неправильно, т.к. это структура с автовыравниванием на 4. Нужно добавить выравнивающий word после EventType Код (Text): INPUT_RECORD STRUCT EventType WORD ? Unused WORD ? ;выравнивающий ворд UNION ... ENDS INPUT_RECORD ENDS
Догадался Заглянул в дельфийские сорцы - там KEY_EVENT_RECORD объявлена как packed record, а INPUT_RECORD - нет, т.е.выравненная. Значит тоже самое должно быть и в виндовых хидерах
и все-таки, в сях нужно обращаться как ir.Event.KeyEvent значит соответсвенно и в масме нужно оформлять структуру так чтоб обращаться также, может от этого глюк зависит? Код (Text): typedef struct _INPUT_RECORD { // ir WORD EventType; union { KEY_EVENT_RECORD KeyEvent; MOUSE_EVENT_RECORD MouseEvent; WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent; MENU_EVENT_RECORD MenuEvent; FOCUS_EVENT_RECORD FocusEvent; } Event; } INPUT_RECORD;