-
Notifications
You must be signed in to change notification settings - Fork 37
/
KeyEvent.h
118 lines (94 loc) · 2.28 KB
/
KeyEvent.h
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
//
// Copyright (C) 2013 Hong Jen Yee (PCMan) <[email protected]>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public
// License along with this library; if not, write to the
// Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
// Boston, MA 02110-1301, USA.
//
#ifndef IME_KEY_EVENT_H
#define IME_KEY_EVENT_H
#include <Windows.h>
namespace Ime {
class KeyEvent {
public:
KeyEvent(UINT type, WPARAM wp, LPARAM lp);
KeyEvent(const KeyEvent& other);
~KeyEvent(void);
UINT type() {
return type_;
}
UINT keyCode() {
return keyCode_;
}
UINT charCode() {
return charCode_;
}
bool isChar() {
return (charCode_ != 0);
}
LPARAM lParam() {
return lParam_;
}
unsigned short repeatCount() {
// bits 0-15
return (unsigned short)(lParam_ & 0xffff);
}
unsigned char scanCode() {
// bits 16-23
return (unsigned char)(lParam_ & 0xff0000);
}
bool isExtended() {
// bit 24
return (lParam_ & (1<<24)) != 0;
}
bool isKeyDown(UINT code) const {
return (keyStates_[code] & (1 << 7)) != 0;
}
bool isKeyToggled(UINT code) const {
return (keyStates_[code] & 1) != 0;
}
const BYTE* keyStates() const {
return keyStates_;
}
private:
KeyEvent(void) {}
private:
UINT type_;
UINT keyCode_;
UINT charCode_;
LPARAM lParam_;
BYTE keyStates_[256];
};
// Try to use KeyEvent::isKeyDown() and KeyEvent::isKeyToggled() whenever possible.
// If a KeyEvent object is not available, then build a KeyState object as an alternative
// to get key states
class KeyState {
public:
KeyState(int keyCode, bool sync = true) {
state_ = ::GetKeyState(keyCode);
}
bool isDown() {
return ((state_ & (1 << 15)) != 0);
}
bool isToggled() {
return ((state_ & 1) != 0);
}
short state() {
return state_;
}
private:
short state_;
};
}
#endif