Обработка клавиши в консоли
От: Звероящер Россия  
Дата: 14.07.09 05:00
Оценка:
Здравствуйте!
Есть консольное приложение, мне нужно обрабатывать в нём нажатие определённой клавиши.
Очень подошла функция GetKeyState(), но мне нужно обрабатывать клавишу асинхронно, то есть приложение всё время спит и не занимает процессорного времени, но как только произошло нажатие клавиши, оно проснулось, обработало его и снова уснуло. Что-то вроде такого:

HANDLE hEvent;
DWORD EventMask;
SHORT keyb;

hEvent = CreateEvent(
NULL,
false, // auto-reset event
false, // non-signalled state
""
);
EventMask = <ххххх>;

/*
А вот тут надо бы привязать к событию функцию обработки клавиши.
типа такого: keyb=GetKeyState(VK_ESCAPE);
И как её сделать, не догоняю....
*/
while(1)
{
WaitForSingleObject(hEvent,INFINITE);
printf("%x \n", keyb);

}


Всем спасибо!
Re: Обработка клавиши в консоли
От: Сергей Мухин Россия  
Дата: 14.07.09 06:15
Оценка:
Здравствуйте, Звероящер, Вы писали:

З>Есть консольное приложение, мне нужно обрабатывать в нём нажатие определённой клавиши.

З>Очень подошла функция GetKeyState(), но мне нужно обрабатывать клавишу асинхронно, то есть приложение всё время спит и не занимает процессорного времени, но как только произошло нажатие клавиши, оно проснулось, обработало его и снова уснуло. Что-то вроде такого:


З>Всем спасибо!


попробуйте почитать MSDN. Например это:

A process can specify a console input buffer handle in one of the wait functions to determine when there is unread console input. When the input buffer is not empty, the state of a console input buffer handle is signaled.




ps
пожалуйста — форматируйте текст — читать невозможно
---
С уважением,
Сергей Мухин
Re: Обработка клавиши в консоли
От: -prus-  
Дата: 14.07.09 06:28
Оценка:
Здравствуйте, Звероящер, Вы писали:

З>Здравствуйте!

З>Есть консольное приложение, мне нужно обрабатывать в нём нажатие определённой клавиши.
З>Очень подошла функция GetKeyState(), но мне нужно обрабатывать клавишу асинхронно, то есть приложение всё время спит и не занимает процессорного времени, но как только произошло нажатие клавиши, оно проснулось, обработало его и снова уснуло. Что-то вроде такого:

Может это поможет:

#include <stdio.h>
#include <conio.h>

while(1) {
    char ch = getch();
    printf("Key - %d\n", (int)ch); // Для ESCAPE ch = 0x1B (27)
}
С уважением,
Евгений
Re[2]: Обработка клавиши в консоли
От: Звероящер Россия  
Дата: 14.07.09 06:41
Оценка:
Здравствуйте, -prus-, Вы писали:

P>Здравствуйте, Звероящер, Вы писали:


З>>Здравствуйте!

З>>Есть консольное приложение, мне нужно обрабатывать в нём нажатие определённой клавиши.
З>>Очень подошла функция GetKeyState(), но мне нужно обрабатывать клавишу асинхронно, то есть приложение всё время спит и не занимает процессорного времени, но как только произошло нажатие клавиши, оно проснулось, обработало его и снова уснуло. Что-то вроде такого:

P>Может это поможет:


P>
P>#include <stdio.h>
P>#include <conio.h>

P>while(1) {
P>    char ch = getch();
P>    printf("Key - %d\n", (int)ch); // Для ESCAPE ch = 0x1B (27)
P>}
P>


Ну это я знаю
У меня там еще всякая хрень крутится, несвязанная с кнопкой, и эта хрень тоже асинхронная я вот её подцепил, а клаву не могу пока...
Re[3]: Обработка клавиши в консоли
От: -prus-  
Дата: 14.07.09 06:51
Оценка:
Здравствуйте, Звероящер, Вы писали:

З>Здравствуйте, -prus-, Вы писали:


P>>Здравствуйте, Звероящер, Вы писали:


З>>>Здравствуйте!

З>>>Есть консольное приложение, мне нужно обрабатывать в нём нажатие определённой клавиши.
З>>>Очень подошла функция GetKeyState(), но мне нужно обрабатывать клавишу асинхронно, то есть приложение всё время спит и не занимает процессорного времени, но как только произошло нажатие клавиши, оно проснулось, обработало его и снова уснуло. Что-то вроде такого:

P>>Может это поможет:


P>>
P>>#include <stdio.h>
P>>#include <conio.h>

P>>while(1) {
P>>    char ch = getch();
P>>    printf("Key - %d\n", (int)ch); // Для ESCAPE ch = 0x1B (27)
P>>}
P>>


З>Ну это я знаю

З>У меня там еще всякая хрень крутится, несвязанная с кнопкой, и эта хрень тоже асинхронная я вот её подцепил, а клаву не могу пока...

Может создать еще поток, в нем сделать getch() и синхронизовать с остальной работой?
С уважением,
Евгений
Re[4]: Обработка клавиши в консоли
От: Звероящер Россия  
Дата: 14.07.09 09:44
Оценка:
Здравствуйте, -prus-, Вы писали:

P>Здравствуйте, Звероящер, Вы писали:


З>>Здравствуйте, -prus-, Вы писали:


P>>>Здравствуйте, Звероящер, Вы писали:


З>>>>Здравствуйте!

З>>>>Есть консольное приложение, мне нужно обрабатывать в нём нажатие определённой клавиши.
З>>>>Очень подошла функция GetKeyState(), но мне нужно обрабатывать клавишу асинхронно, то есть приложение всё время спит и не занимает процессорного времени, но как только произошло нажатие клавиши, оно проснулось, обработало его и снова уснуло. Что-то вроде такого:

P>>>Может это поможет:


P>>>
P>>>#include <stdio.h>
P>>>#include <conio.h>

P>>>while(1) {
P>>>    char ch = getch();
P>>>    printf("Key - %d\n", (int)ch); // Для ESCAPE ch = 0x1B (27)
P>>>}
P>>>


З>>Ну это я знаю

З>>У меня там еще всякая хрень крутится, несвязанная с кнопкой, и эта хрень тоже асинхронная я вот её подцепил, а клаву не могу пока...

P>Может создать еще поток, в нем сделать getch() и синхронизовать с остальной работой?


Всё, разобрался!
Всем спасибо!

На всякий случай пример с МСДН...



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

VOID ErrorExit(LPSTR);
VOID KeyEventProc(KEY_EVENT_RECORD); 
VOID MouseEventProc(MOUSE_EVENT_RECORD); 
VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD); 
 
int main(VOID) 
{ 
    HANDLE hStdin; 
    DWORD cNumRead, fdwMode, fdwSaveOldMode, i; 
    INPUT_RECORD irInBuf[128]; 
    int counter=0;
 
    // Get the standard input handle. 
 
    hStdin = GetStdHandle(STD_INPUT_HANDLE); 
    if (hStdin == INVALID_HANDLE_VALUE) 
        ErrorExit(TEXT("GetStdHandle")); 
 
    // Save the current input mode, to be restored on exit. 
 
    if (! GetConsoleMode(hStdin, &fdwSaveOldMode) ) 
        ErrorExit(TEXT("GetConsoleMode")); 
 
    // Enable the window and mouse input events. 
 
    fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT; 
    if (! SetConsoleMode(hStdin, fdwMode) ) 
        ErrorExit(TEXT("SetConsoleMode")); 
 
    // Loop to read and handle the input events. 
 
    while (counter++ <= 100) 
    { 
        // Wait for the events. 
 
        if (! ReadConsoleInput( 
                hStdin,      // input buffer handle 
                irInBuf,     // buffer to read into 
                128,         // size of read buffer 
                &cNumRead) ) // number of records read 
            ErrorExit(TEXT("ReadConsoleInput")); 
 
        // Dispatch the events to the appropriate handler. 
 
        for (i = 0; i < cNumRead; i++) 
        {
            switch(irInBuf[i].EventType) 
            { 
                case KEY_EVENT: // keyboard input 
                    KeyEventProc(irInBuf[i].Event.KeyEvent); 
                    break; 
 
                case MOUSE_EVENT: // mouse input 
                    MouseEventProc(irInBuf[i].Event.MouseEvent); 
                    break; 
 
                case WINDOW_BUFFER_SIZE_EVENT: // scrn buf. resizing 
                    ResizeEventProc( 
                        irInBuf[i].Event.WindowBufferSizeEvent); 
                    break; 
 
                case FOCUS_EVENT:  // disregard focus events 
 
                case MENU_EVENT:   // disregard menu events 
                    break; 
 
                default: 
                    ErrorExit(TEXT("Unknown event type")); 
                    break; 
            } 
        }
    } 
 
    return 0; 
}

VOID ErrorExit (LPSTR lpszMessage) 
{ 
    fprintf(stderr, "%s\n", lpszMessage); 
    ExitProcess(0); 
}

VOID KeyEventProc(KEY_EVENT_RECORD ker)
{
    printf("Key event: ");

    if(ker.bKeyDown)
        printf("key pressed\n");
    else printf("key released\n");
}

VOID MouseEventProc(MOUSE_EVENT_RECORD mer)
{
#ifndef MOUSE_HWHEELED
#define MOUSE_HWHEELED 0x0008
#endif
    printf("Mouse event: ");
    
    switch(mer.dwEventFlags)
    {
        case 0:
            printf("button press\n");
            break;
        case DOUBLE_CLICK:
            printf("double click\n");
            break;
        case MOUSE_HWHEELED:
            printf("horizontal mouse wheel\n");
            break;
        case MOUSE_MOVED:
            printf("mouse moved\n");
            break;
        case MOUSE_WHEELED:
            printf("vertical mouse wheel\n");
            break;
        default:
            printf("unknown\n");
            break;
    }
}

VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD wbsr)
{
    printf("Resize event\n");
}
Re[5]: Обработка клавиши в консоли
От: Сергей Мухин Россия  
Дата: 14.07.09 09:54
Оценка:
Здравствуйте, Звероящер, Вы писали:


Этот пример имеет один недостаток. Как остановить цикл? Я бы предложил все таки WaitForMultipleObjects которая бы ждала консольное событие или Event от главной программы с командой

зы
хорошо бы форматировать текст как C (кнопка внизу)
---
С уважением,
Сергей Мухин
Re[6]: Обработка клавиши в консоли
От: Звероящер Россия  
Дата: 14.07.09 10:26
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, Звероящер, Вы писали:



СМ>Этот пример имеет один недостаток. Как остановить цикл? Я бы предложил все таки WaitForMultipleObjects которая бы ждала консольное событие или Event от главной программы с командой


СМ>зы

СМ>хорошо бы форматировать текст как C (кнопка внизу)

Вот это я и попытаюсь сделать
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.