|
|
1.1 root 1: #include <windows.h>
2: #include <stdio.h>
3: #include <string.h>
4: #include "console.h"
5:
6: /* maximum number of input queue events to peek at */
7: #define INPUT_RECS 256
8:
9: /* array of records to store peeked events from the input queue */
10: INPUT_RECORD aInputBuffer[INPUT_RECS];
11:
12: /*********************************************************************
13: * FUNCTION: demoGetNumEvents(HANDLE hConOut) *
14: * *
15: * PURPOSE: demonstrate GetNumberOfConsoleInputEvents, *
16: * PeekConsoleInput, and ReadConsoleInput. Delay the *
17: * processing of console input to start filling the input *
18: * queue. The number of console events in the input queue *
19: * will be updated in the status line at the top of the *
20: * console. Peek the unread characters for an ESC and return *
21: * when one is found *
22: * *
23: * INPUT: console output handle to write to *
24: *********************************************************************/
25:
26: void demoGetNumEvents(HANDLE hConOut)
27: {
28: BOOL bSuccess;
29: DWORD dwNumEvents; /* number of events in the input queue */
30: DWORD dwStdInMode; /* save the input mode here */
31: HANDLE hStdIn;
32: DWORD dwInputEvents; /* number of events read from the queue */
33: CHAR bOutBuf[256], szTemp[256];
34: /* indexes to latest unread event checked for ESC char */
35: DWORD iEvent, iPrevEvent;
36: DWORD dwEventsPeeked; /* number of events peeked at */
37: unsigned i;
38: DWORD dwCharsWritten;
39:
40: setConTitle(__FILE__);
41: hStdIn = GetStdHandle(STD_INPUT_HANDLE);
42: PERR((int) hStdIn != -1,"GetStdHandle");
43: myPuts(hConOut, "\nLet's display a running count of events waiting in the\n"
44: "console input queue by using the GetNumberOfConsoleInputEvents\n"
45: "API. I will enable mouse input in this console; try\n"
46: "generating a lot of mouse and keyboard events. I will\n"
47: "read them from the input queue using ReadConsoleInput\n"
48: "with .5 second delays between reads. Note the event\n"
49: "count and event information on the top line.\n\n"
50: "Hit ESC at any time to return. We will use\n"
51: "PeekConsoleInput to monitor the unread input queue\n"
52: "contents for an ESC character. When this character\n"
53: "is detected, we will flush the input queue and return\n"
54: "immediately. Note that for simplification of this\n"
55: "demo only the first 256 unread events will be scanned\n"
56: "to find an ESC keystroke.\n\n");
57:
58: bSuccess = GetConsoleMode(hStdIn, &dwStdInMode);
59: PERR(bSuccess, "GetConsoleMode");
60: /* when turning off ENABLE_LINE_INPUT, you MUST also turn off */
61: /* ENABLE_ECHO_INPUT. */
62: bSuccess = SetConsoleMode(hStdIn, (dwStdInMode & ~(ENABLE_LINE_INPUT |
63: ENABLE_ECHO_INPUT)) | ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT);
64: PERR(bSuccess, "SetConsoleMode");
65: iEvent = 0; /* index to last event peeked in the input queue */
66: for(;;)
67: {
68: Sleep(500);
69: bSuccess = GetNumberOfConsoleInputEvents(hStdIn, &dwNumEvents);
70: PERR(bSuccess, "GetNumberOfConsoleInputEvents");
71: sprintf(bOutBuf, "input queue events: %d", dwNumEvents);
72: if (!dwNumEvents)
73: /* put a status line on the first line */
74: putStatusLine(hConOut, bOutBuf);
75: else
76: {
77: /* save the previous index we've peeked at */
78: iPrevEvent = iEvent;
79: /* peek at the console input queue. Don't peek more than what will */
80: /* fit in the buffer */
81: bSuccess = PeekConsoleInput(hStdIn, aInputBuffer, min(dwNumEvents,
82: INPUT_RECS), &dwEventsPeeked);
83: PERR(bSuccess, "PeekConsoleInput");
84: /* set current index to the highest number event peeked at */
85: iEvent = dwEventsPeeked;
86: /* scan unread events for an ESC key */
87: for (i = iPrevEvent; i < iEvent; i++)
88: {
89: if (aInputBuffer[i].EventType == KEY_EVENT &&
90: aInputBuffer[i].Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)
91: {
92: /* set input mode back to what it was originally */
93: bSuccess = SetConsoleMode(hStdIn, dwStdInMode);
94: PERR(bSuccess, "SetConsoleMode");
95: /* flush the input buffer and return */
96: bSuccess = FlushConsoleInputBuffer(hStdIn);
97: PERR(bSuccess, "FlushConsoleInputBuffer");
98: return;
99: }
100: } /* for */
101: } /* else */
102: bSuccess = ReadConsoleInput(hStdIn, &aInputBuffer[0], 1, &dwInputEvents);
103: PERR(bSuccess, "ReadConsoleInput");
104: /* decrement "last peeked at" index by number of records we just read */
105: iEvent -= dwInputEvents;
106: switch (aInputBuffer[0].EventType)
107: {
108: case KEY_EVENT:
109: if (aInputBuffer[0].Event.KeyEvent.bKeyDown)
110: {
111: if (aInputBuffer[0].Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)
112: {
113: /* set input mode back to what it was originally */
114: bSuccess = SetConsoleMode(hStdIn, dwStdInMode);
115: PERR(bSuccess, "SetConsoleMode");
116: return;
117: }
118: /* put the keystroke information on the status line */
119: sprintf(szTemp, " keystroke: %c",
120: aInputBuffer[0].Event.KeyEvent.uChar.AsciiChar);
121: strcat(bOutBuf, szTemp);
122: /* put the status line on the screen */
123: putStatusLine(hConOut, bOutBuf);
124: /* output the character read from the input queue */
125: bSuccess = WriteFile(hConOut,
126: &aInputBuffer[0].Event.KeyEvent.uChar.AsciiChar, 1,
127: &dwCharsWritten, NULL);
128: PERR(bSuccess, "WriteFile");
129: }
130: break;
131: case MOUSE_EVENT:
132: sprintf(szTemp, " mouse: %s at %d, %d",
133: (aInputBuffer[0].Event.MouseEvent.dwEventFlags == MOUSE_MOVED ?
134: "moved" : "clicked"), aInputBuffer[0].Event.MouseEvent.dwMousePosition.X,
135: aInputBuffer[0].Event.MouseEvent.dwMousePosition.Y);
136: strcat(bOutBuf, szTemp);
137: putStatusLine(hConOut, bOutBuf);
138: break;
139: case WINDOW_BUFFER_SIZE_EVENT:
140: sprintf(szTemp, " window: %d, %d",
141: aInputBuffer[0].Event.WindowBufferSizeEvent.dwSize.X,
142: aInputBuffer[0].Event.WindowBufferSizeEvent.dwSize.Y);
143: strcat(bOutBuf, szTemp);
144: putStatusLine(hConOut, bOutBuf);
145: break;
146: } /* switch */
147: } /* while */
148: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.