Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Win API / 8 сообщений из 8, страница 1 из 1
14.02.2012, 15:50
    #37661298
kmaw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Win API
Задача считать символы и определить, какие клавиши типа 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
14.02.2012, 15:59
    #37661325
kmaw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Win API
сложность в том, что все события клавиатуры происходят последовательно, а мне надо отлавливать "высокоуровневые" события одновременного нажатия нескольких клавиш (причем в произвольной последовательности)
...
Рейтинг: 0 / 0
14.02.2012, 16:20
    #37661359
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Win API
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
14.02.2012, 16:22
    #37661366
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Win API
Потому что надо отслеживать события нажатия-отпускания клавиш. Типа как здесь .
...
Рейтинг: 0 / 0
14.02.2012, 23:27
    #37662018
kmaw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Win API
вроде разобрался. но хотелось бы ссылку на готовое, что-ли, решение
...
Рейтинг: 0 / 0
14.02.2012, 23:29
    #37662022
kmaw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Win API
а то у меня что-то совсем какой-то говнокод получился
...
Рейтинг: 0 / 0
15.02.2012, 08:40
    #37662262
kmaw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Win API
Код: 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
15.02.2012, 12:16
    #37662645
kmaw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Win API
вопрос снят
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Win API / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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