|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Ноя 3, 2003 03:49:59 · Поправил: Vasya Pupkin Мне надо было в консольной программе скрыть курсор. Помогло invoke SetConsoleCursorInfo,StdHandle,ADDR HideCursor , где HideCursor, по идее, структура CONSOLE_CURSOR_INFO (http://plugring.farmanager.com/programming/winapi/console_cursor_info .html). Я даже нашёл в windows.inc эту структуру, но - как её правильно использовать (ну только начал изучать Assembler)? Пока, не долго думая, написал в секции инициализируемых данных: HideCursor dw 99,FALSE , но, подозреваю, это не совсем правильно. Так как? |
|
|
Дата: Ноя 3, 2003 05:35:47 У тебя, как минимум, ошибка в типах полей структуры. Плюс надо разобраться как передавать адрес: через addr или offset Если CONSOLE_CURSOR_INFO в сегменте данных, то ... .data cci CONSOLE_CURSOR_INFO <?, ?> ... .code ... ; инициализировать cci, чтобы не менять размер курсора invoke GetConsoleCursorInfo, hCon, offset cci ... ; поуправлять признаком видимости mov cci.bVisible,FALSE ; или TRUE invoke SetConsoleCursorInfo, hCon, offset cci ...если CONSOLE_CURSOR_INFO - локальная переменная, то ... .code ... LOCAL cci:CONSOLE_CURSOR_INFO ... ; инициализировать cci, чтобы не менять размер курсора invoke GetConsoleCursorInfo, hCon, addr cci ... ; поуправлять признаком видимости mov cci.bVisible,FALSE ; или TRUE invoke SetConsoleCursorInfo, hCon, addr cci ...Еще возможен вариант с динамическим выделением памяти под CONSOLE_CURSOR_INFO - попробуй сам. |
|
|
Дата: Ноя 3, 2003 05:44:03 · Поправил: Vasya Pupkin b_b, спасибо. Правда, и мой вариант работает (я аж сам удивился), но правильный вариант, IMHO, всегда лучше. |
|
|
Дата: Ноя 3, 2003 22:49:48 А как насчёт структуры INPUT_RECORD, которую используют в ReadConsoleInput? Кроме того, там есть ещё структура KEY_EVENT_RECORD... На запостит ли кто на форум краткий примерчик? |
|
|
Дата: Ноя 4, 2003 05:33:35 Vasya Pupkin
; WaitESC.asm
.486
.model flat, stdcall
option casemap :none
include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
qqEVENT UNION
KeyEvent KEY_EVENT_RECORD <>
MouseEvent MOUSE_EVENT_RECORD <>
WindowBufferSizeEvent WINDOW_BUFFER_SIZE_RECORD <>
MenuEvent MENU_EVENT_RECORD <>
FocusEvent FOCUS_EVENT_RECORD <>
qqEVENT ENDS
INPUT_RECORD STRUC
EventType WORD ?
WORD ? ; __alignmentDummy
Event qqEVENT <>
INPUT_RECORD ENDS
.const
szHi db 'hi',0
szGetStdHandle db 'GetStdHandle failed',10,0
szPressEsc db 'Press Esc to Exit',10,0
szGetNumberOfConsoleInputEvents db 'GetNumberOfConsoleInputEvents failed',10,0
szReadConsoleInput db 'ReadConsoleInput failed',10,0
.code
_Printf proc pszStr:PSTR
LOCAL dwWriten:DWORD
LOCAL hCon:HANDLE
.if pszStr != NULL
invoke GetStdHandle, STD_OUTPUT_HANDLE
.if eax == INVALID_HANDLE_VALUE
invoke MessageBox, NULL, offset szGetStdHandle, offset szHi, MB_OK
.else
mov hCon,eax
invoke lstrlen, pszStr
.if eax != 0
mov ecx,eax
invoke WriteFile, hCon, pszStr, ecx, addr dwWriten, NULL
.endif
.endif
.endif
ret
_Printf endp
_Main proc
LOCAL ir:INPUT_RECORD
LOCAL hCon:HANDLE
LOCAL NumOfEvents:DWORD
LOCAL NumOfEventsRead:DWORD
LOCAL done:DWORD
LOCAL szBuff:DWORD
push ebx
mov szBuff,0
invoke GetStdHandle, STD_INPUT_HANDLE
.if eax == INVALID_HANDLE_VALUE
invoke _Printf, offset szGetStdHandle
.else
mov hCon,eax
invoke _Printf, offset szPressEsc
mov done,FALSE
.while done == FALSE
invoke GetNumberOfConsoleInputEvents, hCon, addr NumOfEvents
.if eax == FALSE
invoke _Printf, offset szGetNumberOfConsoleInputEvents
mov done,TRUE
.else
xor ebx,ebx
.while ebx < NumOfEvents
invoke ReadConsoleInput, hCon, addr ir, 1, addr NumOfEventsRead
.if eax == FALSE
invoke _Printf, offset szReadConsoleInput
mov done,TRUE
.break
.else
.if NumOfEventsRead == 1
.if (ir.EventType == KEY_EVENT) && \
(ir.Event.KeyEvent.bKeyDown == TRUE)
.if ir.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE
mov done,TRUE
.else
mov al,ir.Event.KeyEvent.uChar.AsciiChar
mov byte ptr szBuff,al
invoke _Printf, addr szBuff
.endif
.endif
.endif
.endif
inc ebx
.endw
.endif
.endw
.endif
pop ebx
invoke ExitProcess, 0
_Main endp
end _Main |
|
|
Дата: Ноя 5, 2003 16:16:45 Спасибо. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.084 |