Здравствуйте!
Есть консольное приложение, мне нужно обрабатывать в нём нажатие определённой клавиши.
Очень подошла функция GetKeyState(), но мне нужно обрабатывать клавишу асинхронно, то есть приложение всё время спит и не занимает процессорного времени, но как только произошло нажатие клавиши, оно проснулось, обработало его и снова уснуло. Что-то вроде такого:
/*
А вот тут надо бы привязать к событию функцию обработки клавиши.
типа такого: keyb=GetKeyState(VK_ESCAPE);
И как её сделать, не догоняю....
*/
while(1)
{
WaitForSingleObject(hEvent,INFINITE);
printf("%x \n", keyb);
Здравствуйте, Звероящер, Вы писали:
З>Есть консольное приложение, мне нужно обрабатывать в нём нажатие определённой клавиши. З>Очень подошла функция 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
пожалуйста — форматируйте текст — читать невозможно
Здравствуйте, Звероящер, Вы писали:
З>Здравствуйте! З>Есть консольное приложение, мне нужно обрабатывать в нём нажатие определённой клавиши. З>Очень подошла функция GetKeyState(), но мне нужно обрабатывать клавишу асинхронно, то есть приложение всё время спит и не занимает процессорного времени, но как только произошло нажатие клавиши, оно проснулось, обработало его и снова уснуло. Что-то вроде такого:
Здравствуйте, -prus-, Вы писали:
P>Здравствуйте, Звероящер, Вы писали:
З>>Здравствуйте! З>>Есть консольное приложение, мне нужно обрабатывать в нём нажатие определённой клавиши. З>>Очень подошла функция GetKeyState(), но мне нужно обрабатывать клавишу асинхронно, то есть приложение всё время спит и не занимает процессорного времени, но как только произошло нажатие клавиши, оно проснулось, обработало его и снова уснуло. Что-то вроде такого:
P>Может это поможет:
P>
Здравствуйте, Звероящер, Вы писали:
З>Здравствуйте, -prus-, Вы писали:
P>>Здравствуйте, Звероящер, Вы писали:
З>>>Здравствуйте! З>>>Есть консольное приложение, мне нужно обрабатывать в нём нажатие определённой клавиши. З>>>Очень подошла функция GetKeyState(), но мне нужно обрабатывать клавишу асинхронно, то есть приложение всё время спит и не занимает процессорного времени, но как только произошло нажатие клавиши, оно проснулось, обработало его и снова уснуло. Что-то вроде такого:
P>>Может это поможет:
P>>
Здравствуйте, -prus-, Вы писали:
P>Здравствуйте, Звероящер, Вы писали:
З>>Здравствуйте, -prus-, Вы писали:
P>>>Здравствуйте, Звероящер, Вы писали:
З>>>>Здравствуйте! З>>>>Есть консольное приложение, мне нужно обрабатывать в нём нажатие определённой клавиши. З>>>>Очень подошла функция GetKeyState(), но мне нужно обрабатывать клавишу асинхронно, то есть приложение всё время спит и не занимает процессорного времени, но как только произошло нажатие клавиши, оно проснулось, обработало его и снова уснуло. Что-то вроде такого:
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");
}
Этот пример имеет один недостаток. Как остановить цикл? Я бы предложил все таки WaitForMultipleObjects которая бы ждала консольное событие или Event от главной программы с командой
зы
хорошо бы форматировать текст как C (кнопка внизу)
Здравствуйте, Сергей Мухин, Вы писали:
СМ>Здравствуйте, Звероящер, Вы писали:
СМ>Этот пример имеет один недостаток. Как остановить цикл? Я бы предложил все таки WaitForMultipleObjects которая бы ждала консольное событие или Event от главной программы с командой
СМ>зы СМ>хорошо бы форматировать текст как C (кнопка внизу)