· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Структуры и MASM32

Посл.отвђт Сообщен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