powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Win API
8 сообщений из 8, страница 1 из 1
Win API
    #37661298
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача считать символы и определить, какие клавиши типа shift, ctrl и т.п. при этом также были нажаты. Также учитывается включенный Caps, NumLock, ScroolLock
Наример
[Caps]Ctrl + A, Ctrl + Shift + H, [ScroolLock]Alt + s

сделать это надо с использованием функции ReadConsoleInput

Это - лаба. Все на до реализовать не используя никаких высокоуровневых средств.

делаю примерно так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
while (1)
{

       // Ожидание событий.
       ReadConsoleInput(
                hStdin,      // дескриптор буфера ввода
                irInBuf,     // буфер, в котором читаем
                128,         // размер буфера чтения
                &cNumRead);

        
	   
        // Направляем события обработчику
        for (i = 0; i < cNumRead; i++)
        {
            switch(irInBuf[i].EventType)
            {
                case KEY_EVENT: // ввод с клавиатуры
                    if(KeyEventProc(irInBuf[i].Event.KeyEvent))
	         {
		 ...				
	         }
                    break;
               
            }
        }

		
    }



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
bool KeyEventProc(KEY_EVENT_RECORD r)
{
    /*игнорируем key up events */
    if (!r.bKeyDown)
        return false;

    ...
}



вроде работает через раз - что-то совсем запутался. Подскажите идею, как это нормально надо делать?

списибо
...
Рейтинг: 0 / 0
Win API
    #37661325
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сложность в том, что все события клавиатуры происходят последовательно, а мне надо отлавливать "высокоуровневые" события одновременного нажатия нескольких клавиш (причем в произвольной последовательности)
...
Рейтинг: 0 / 0
Win API
    #37661359
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmaw,

ПаЦсказка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
VOID KeyEventProc(KEY_EVENT_RECORD ker)
{
	if (! ker.bKeyDown)
		return;

	if (ker.dwControlKeyState && CAPSLOCK_ON)
		printf("CAPSLOCK: ON\n");
}
...
Рейтинг: 0 / 0
Win API
    #37661366
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что надо отслеживать события нажатия-отпускания клавиш. Типа как здесь .
...
Рейтинг: 0 / 0
Win API
    #37662018
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде разобрался. но хотелось бы ссылку на готовое, что-ли, решение
...
Рейтинг: 0 / 0
Win API
    #37662022
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а то у меня что-то совсем какой-то говнокод получился
...
Рейтинг: 0 / 0
Win API
    #37662262
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>


/*
Отслеживание комбинаций клавиш осуществляется согласно сл. правила:
если событие нажатия клавиши Б произошло после события нажатия клавиши А, 
но до события отпускания клавиши А, то клавиши Б и А нажаты одновременно
*/
KEY_EVENT_RECORD* keyEvents[3];
int keyEventFlags[3] = {0,0,0};

void addKeyEventToList(KEY_EVENT_RECORD r)
{
	if(!keyEventFlags[0])
	{
		memcpy(keyEvents[0], &r, sizeof(KEY_EVENT_RECORD)); 
		keyEventFlags[0] = 1;
	}
	else if (!keyEventFlags[1])
	{
		memcpy(keyEvents[1], &r, sizeof(KEY_EVENT_RECORD));
		keyEventFlags[1] = 1;
	}
	else if(!keyEventFlags[2])
	{
		memcpy(keyEvents[2], &r, sizeof(KEY_EVENT_RECORD));
		keyEventFlags[2] = 1;
	}
	else
	{
		memcpy(keyEvents[0], &r, sizeof(KEY_EVENT_RECORD));
		keyEventFlags[0] = 1;
		keyEventFlags[1] = 0;
		keyEventFlags[2] = 0;
	}

}

bool KeyEventProc(KEY_EVENT_RECORD r, char* c, bool* capsLock, bool* scrollLock)
{
	*c = r.uChar.AsciiChar;
	*capsLock = r.dwControlKeyState & CAPSLOCK_ON;
	*scrollLock = r.dwControlKeyState & SCROLLLOCK_ON;	
	
	if(!r.bKeyDown) //отпущена клавиша
		return true;
	else
	{
		addKeyEventToList(r);
		return false;
	}

}

void printKeyInfo()
{
	
	for(int i = 0; i < 3; i++)
	{
		if(!keyEventFlags[i])
			return;

		printf("%c\n", keyEvents[i]->uChar.AsciiChar);
		printf("%d\n", keyEvents[i]->wVirtualKeyCode);
	}
	
	
}

void main()
{
	keyEvents[0] = (KEY_EVENT_RECORD*)calloc(1, sizeof(KEY_EVENT_RECORD));
	keyEvents[1] = (KEY_EVENT_RECORD*)calloc(1, sizeof(KEY_EVENT_RECORD));
	keyEvents[2] = (KEY_EVENT_RECORD*)calloc(1, sizeof(KEY_EVENT_RECORD));
	
	HANDLE hStdin;
    DWORD cNumRead, fdwMode, fdwSaveOldMode, i;
    INPUT_RECORD irInBuf[128];

    //Получим стандартный дескриптор ввода.
    hStdin = GetStdHandle(STD_INPUT_HANDLE);
    
    //Сохраним текущий режим ввода для будущего восстановления при
    //выходе из программы.
    GetConsoleMode(hStdin, &fdwSaveOldMode);

    //Включим события ввода от мыши и окна
    fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;
    SetConsoleMode(hStdin, fdwMode);

    char c; 
	bool capsLock; 
	bool scrollLock;
	
	//Цикл чтения и обработки событий ввода
	while (1)
	{

       //Ожидание событий
       ReadConsoleInput(
                hStdin,      //дескриптор буфера ввода
                irInBuf,     //буфер, в который читаем
                128,         //размер буфера чтения
                &cNumRead    //количество прочитанных событий
				);

        
	   
        //Направляем события обработчику
        for (i = 0; i < cNumRead; i++)
        {
            switch(irInBuf[i].EventType)
            {
                case KEY_EVENT: // ввод с клавиатуры
                    if(KeyEventProc(irInBuf[i].Event.KeyEvent, &c, &capsLock, &scrollLock))
					{
		 				printf("-------------------------------\n");
						printf("%d\n", c);
						printf("%s\n", capsLock ? "CAPSLOCK_ON": "-");
						printf("%s\n", scrollLock ? "SCROLLLOCK_ON" : "-");

						printKeyInfo();

						for(int i = 0; i < 3; i++)
							keyEventFlags[i] = 0;
						
					}
                    break;
               
            }
        }

		
    }
}



вот на такую хрень меня хватило - может посоветуете, как это надо "по взрослому" делать?
...
Рейтинг: 0 / 0
Win API
    #37662645
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопрос снят
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Win API
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]