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

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› консоль

Посл.отвђт Сообщенiе


Дата: Июл 15, 2003 21:43:44

Вопросов 10b:
1) как в консоли отловить код нажатой клавиши и при этом ее не выводить на экран?
Пытаюсь сделать так:
invoke PeekConsoleInput,hStdIn,addr msg_buffer,1,ebx
mov eax,TRUE
.while eax
.if msg_buffer.KeyEvent.wVirtualKeyCode==VK_ESCAPE
mov eax,FALSE
.endif
.endw
но в правильности этого не уверен... и не работает к тому же...
2) как позиционироваться в консоли?
пробую SetConsoleCursorPosition, но не пашет...


Дата: Июл 16, 2003 10:43:49

1)
#include <windows.h>
#include <stdio.h>

int main(void)
{
  INPUT_RECORD ir; 
  HANDLE       hCon;
  DWORD        NumOfEvents;
  DWORD        NumOfEventsRead;
  DWORD        i; 
  BOOL         done;

  if (INVALID_HANDLE_VALUE == (hCon = GetStdHandle(STD_INPUT_HANDLE)))
    printf("GetStdHandle failed %d\n", GetLastError());
  else  
  {
    printf("Press Esc to Exit.\n");
    done = FALSE;
    while (FALSE == done)
      if (FALSE == GetNumberOfConsoleInputEvents(hCon, &NumOfEvents))
      {
        printf("GetNumberOfConsoleInputEvents failed %d\n", GetLastError());
        done = TRUE;
      }
      else
        for (i = 0; i < NumOfEvents; i++)
          if (FALSE == ReadConsoleInput(hCon, &ir, 1, &NumOfEventsRead))
          {
            printf("ReadConsoleInput failed %d\n", GetLastError());
            done = TRUE;
            break;
          }
          else if (1 == NumOfEventsRead)
            done = (KEY_EVENT == ir.EventType && 
                    TRUE      == ir.Event.KeyEvent.bKeyDown &&
                    VK_ESCAPE == ir.Event.KeyEvent.wVirtualKeyCode) ? TRUE : FALSE;
  }

  return 0;
}


2)
#include <windows.h>
#include <stdio.h>

int main(void)
{
  HANDLE hCon;
  COORD  c;

  hCon = CreateConsoleScreenBuffer(
           GENERIC_READ | GENERIC_WRITE,
           FILE_SHARE_READ | FILE_SHARE_WRITE,
           NULL,
           CONSOLE_TEXTMODE_BUFFER,
           NULL);

  if (INVALID_HANDLE_VALUE == hCon)
    printf("CreateConsoleScreenBuffer failed %d\n", GetLastError());
  else
    if (FALSE == SetConsoleActiveScreenBuffer(hCon))
      printf("SetConsoleActiveScreenBuffer failed %d\n", GetLastError());
    else
    {
      c.X = c.Y = 0;
      SetConsoleCursorPosition(hCon, c);
      Sleep(1000);

      c.X = c.Y = 10;
      SetConsoleCursorPosition(hCon, c);
      Sleep(1000);

      c.X = c.Y = 20;
      SetConsoleCursorPosition(hCon, c);
      Sleep(1000);

    if (FALSE == SetConsoleActiveScreenBuffer(GetStdHandle(STD_OUTPUT_HANDLE)))
      printf("SetConsoleActiveScreenBuffer failed %d\n", GetLastError());
    }

  return 0;
}


PS проверял w98se, w2ksp3


Дата: Июл 16, 2003 12:22:05

Спасибо! Мне вообще-то на асме надо, но я переведу.


Дата: Июл 16, 2003 12:27:35

imo winapi и на си winapi, а кода постить в разы меньше


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.083