Вторник, 10 Декабря 2024, 11:28

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Отслеживание системы ввода в WinAPI
Xe[N]oДата: Воскресенье, 08 Января 2012, 21:16 | Сообщение # 1
частый гость
Сейчас нет на сайте
И снова я. smile
Здравствуйте, я пытаюсь написать себе систему, отслеживающую ввод с клавиатуры и мыши. Я нашел в интернете множество функций, отличия в которых я почти не вижу, да и до конца понять как с ними работать я не смог. Вроде как нашел некоторые варианты, но потом находил информацию, к примеру "если пользователь быстро печатает, то все символы не будут отслежены".
Я видел у себя в голове примерно такую структуру - сначала в массив загоняю информацию о всех нажатых клавишах (0 или 1, в том числе и кнопки мыши), в другой позицию мыши. Затем, если хоть одна ячейка равна 1, начинаю уже обработку действий. Ну а затем, если есть надобность, рисую кадр.
Пожалуйста, помогите мне. smile
Я пока продолжаю поиск в интернете, может все же чего-то найду.

Добавлено (08.01.2012, 21:16)
---------------------------------------------
Нашел способ, при помощи WM_KEYDOWN и WM_KEYUP. Но вот проблема, они посылаются только если нажата несистемная клавиша. А мне нужно отслеживать все, включая системные...

ApatiДата: Воскресенье, 08 Января 2012, 21:20 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Есть функция BOOL GetKeyboardState(PBYTE lpKeyState); - загоняет в массив из 256 байтов состояния кнопок.
Xe[N]oДата: Воскресенье, 08 Января 2012, 21:40 | Сообщение # 3
частый гость
Сейчас нет на сайте
Как именно она загоняет? Как я понял, из BOOL, она дает только 2 значения. Как она будет работать с капс локом? Будет так же, определять когда нажата, когда отпущена, или же когда включен, когда отключен? И где можно достать список кодов клавиш? smile
И по поводу мышки, еще ищу... smile
StageДата: Воскресенье, 08 Января 2012, 21:45 | Сообщение # 4
постоянный участник
Сейчас нет на сайте
Ты ничего не понял. В данном случае аргумент PBYTE lpKeyState - это указатель на твой буфер, в котором и будут статусы кнопок. Для справки по WinApi заходим на msdn.
ApatiДата: Воскресенье, 08 Января 2012, 21:47 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
http://msdn.microsoft.com/en-us/library/ms646299(v=VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms632585(v=VS.85).aspx
RorschachДата: Воскресенье, 08 Января 2012, 21:52 | Сообщение # 6
участник
Сейчас нет на сайте
Quote (Xe|N|o)
А мне нужно отслеживать все, включая системные...

WM_SYSKEYDOWN & WM_SYSKEYUP


Never compromise. Not even in the face of Armageddon.
DemeronДата: Воскресенье, 08 Января 2012, 21:57 | Сообщение # 7
User created in C++
Сейчас нет на сайте
Xe[N]o, если нужны отслеживать ВСЕ нажатия и без потери производительности - DLL хук. На клаву хуков в инете полно.
Xe[N]oДата: Воскресенье, 08 Января 2012, 22:04 | Сообщение # 8
частый гость
Сейчас нет на сайте
Quote
Ты ничего не понял. В данном случае аргумент PBYTE lpKeyState - это указатель на твой буфер, в котором и будут статусы кнопок. Для справки по WinApi заходим на msdn.

Я разве что-то против этого сказал? Функция BOOL, что означает, в return она возвращает true или false. Я заметил что обычно, такие функции чаще всего возвращают также 2 значения в переменную. Это зависит исключительно от программиста, который писал код, но чаще всего, так оно и есть.

Quote
Xe[N]o, если нужны отслеживать ВСЕ нажатия и без потери производительности - DLL хук. На клаву хуков в инете полно.

Можно не много по подробней? Я натыкался на такой вариант в интернете, но там это использовалось для отслеживания нажатий именно в фоновом режиме. smile
Apati, сейчас глянем.
Rorschach, тоже спасибо за вариант.)
DemeronДата: Воскресенье, 08 Января 2012, 22:08 | Сообщение # 9
User created in C++
Сейчас нет на сайте
Quote (Xe|N|o)
но там это использовалось для отслеживания нажатий именно в фоновом режиме

А в каком режиме нужно? Нужно только в пределах определенного окна что ли?
Xe[N]oДата: Воскресенье, 08 Января 2012, 22:13 | Сообщение # 10
частый гость
Сейчас нет на сайте
Quote
А в каком режиме нужно? Нужно только в пределах определенного окна что ли?

Нужно именно при фокусировке на мое окно. То есть, только когда мое окно находится в фокусе.
DemeronДата: Воскресенье, 08 Января 2012, 22:22 | Сообщение # 11
User created in C++
Сейчас нет на сайте
1) Можно в DLL хуке проверять активное окно
2) Для своего окна:

в WNDCLASSEX в lpfnWndProc указуешь функцию MsgProc



А проверить, нажата ли клавиша:
Code
bool kd=((GetKeyState(Key) & 0x8000) != 0); // Key - код клавиши


Сообщение отредактировал Demeron - Воскресенье, 08 Января 2012, 22:48
Xe[N]oДата: Воскресенье, 08 Января 2012, 22:27 | Сообщение # 12
частый гость
Сейчас нет на сайте
А от куда взять то, эти самые коды? Если там идет даже ASCII код, то где взять код esc к примеру? Меня пока больше всего привлекает пример с сообщениями, вроде как более надежный, хотя хрен его знает. smile
DemeronДата: Воскресенье, 08 Января 2012, 22:43 | Сообщение # 13
User created in C++
Сейчас нет на сайте
Quote (Xe|N|o)
А от куда взять то, эти самые коды? Если там идет даже ASCII код, то где взять код esc к примеру? Меня пока больше всего привлекает пример с сообщениями, вроде как более надежный, хотя хрен его знает.

Вот кода клавиш из моего движка:


Сообщение отредактировал Demeron - Воскресенье, 08 Января 2012, 22:44
Xe[N]oДата: Воскресенье, 08 Января 2012, 22:47 | Сообщение # 14
частый гость
Сейчас нет на сайте
Благодарю от всей души за помощь! Сейчас только вспомню как конвертировать из lparam и wparam в float, и начну использовать. Еще раз, спасибо.
DemeronДата: Воскресенье, 08 Января 2012, 22:50 | Сообщение # 15
User created in C++
Сейчас нет на сайте
Quote (Xe|N|o)
Благодарю от всей души за помощь! Сейчас только вспомню как конвертировать из lparam и wparam в float, и начну использовать. Еще раз, спасибо.

Ну с этим проще всего =)
Code
float a,b;

a=(float)wParam;
b=(float)lParam;


А для курсора:
Code

float cx;
float cy;
cx=LOWORD(lParam);// позиция курсора X  
cy=HIWORD(lParam);// позиция курсора Y
Xe[N]oДата: Воскресенье, 08 Января 2012, 23:27 | Сообщение # 16
частый гость
Сейчас нет на сайте
Сейчас смотрел, чего не так, почему VS жалуется на код. Я по привычке lParam написал, вместо lparam. smile
Спасибо еще раз. smile


Сообщение отредактировал Xe[N]o - Воскресенье, 08 Января 2012, 23:28
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг