blob: 96adba976c4cade5a850f9ff02dcd7915c8bb4d6 [file] [log] [blame]
// Copyright 2010-2014, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "win32/base/keyboard.h"
#include <memory>
#include "base/logging.h"
namespace mozc {
namespace win32 {
namespace {
using std::unique_ptr;
BYTE ParseVirtualKey(UINT combined_virtual_key) {
const uint16 loword = LOWORD(combined_virtual_key);
if (loword <= 0xff) {
return loword;
}
DLOG(INFO) << "Unexpected VK found. VK = " << loword;
return 0;
}
wchar_t ParseWideChar(UINT combined_virtual_key) {
if (ParseVirtualKey(combined_virtual_key) == VK_PACKET) {
return HIWORD(combined_virtual_key);
} else {
return 0;
}
}
} // namespace
LParamKeyInfo::LParamKeyInfo()
: lparam_(0) {}
LParamKeyInfo::LParamKeyInfo(LPARAM lparam)
: lparam_(lparam) {}
int LParamKeyInfo::GetKeyRepeatCount() const {
return (lparam_ & 0xffff);
}
BYTE LParamKeyInfo::GetScanCode() const {
return static_cast<BYTE>((lparam_ >> 16) & 0xff);
}
bool LParamKeyInfo::IsExtendedKey() const {
// http://msdn.microsoft.com/en-us/library/ms646267.aspx#_win32_Keystroke_Message_Flags
return ((lparam_ >> 24) & 0x1) == 0x1;
}
bool LParamKeyInfo::HasContextCode() const {
// http://msdn.microsoft.com/en-us/library/ms646267.aspx#_win32_Keystroke_Message_Flags
return ((lparam_ >> 29) & 0x1) == 0x1;
}
bool LParamKeyInfo::IsPreviousStateDwon() const {
// http://msdn.microsoft.com/en-us/library/ms646267.aspx#_win32_Keystroke_Message_Flags
return ((lparam_ >> 30) & 0x1) == 0x1;
}
bool LParamKeyInfo::IsInTansitionState() const {
// http://msdn.microsoft.com/en-us/library/ms646267.aspx#_win32_Keystroke_Message_Flags
return ((lparam_ >> 31) & 0x1) == 0x1;
}
bool LParamKeyInfo::IsKeyDownInImeProcessKey() const {
return ((lparam_ >> 31) & 0x1) == 0x0;
}
LPARAM LParamKeyInfo::lparam() const {
return lparam_;
}
VirtualKey::VirtualKey()
: virtual_key_(0),
wide_char_(L'\0'),
unicode_char_(L'\0') {}
VirtualKey::VirtualKey(BYTE virtual_key, wchar_t wide_char,
char32 unicode_char)
: virtual_key_(virtual_key),
wide_char_(wide_char),
unicode_char_(unicode_char) {}
VirtualKey VirtualKey::FromVirtualKey(BYTE virtual_key) {
return VirtualKey(virtual_key, L'\0', L'\0');
}
VirtualKey VirtualKey::FromCombinedVirtualKey(UINT combined_virtual_key) {
const BYTE vk = ParseVirtualKey(combined_virtual_key);
const wchar_t wchar = ParseWideChar(combined_virtual_key);
char32 unicode_char = 0;
if (!IS_HIGH_SURROGATE(wchar) && !IS_LOW_SURROGATE(wchar)) {
unicode_char = wchar;
}
return VirtualKey(vk, wchar, unicode_char);
}
VirtualKey VirtualKey::FromUnicode(char32 unicode_char) {
wchar_t wchar = L'\0';
if (unicode_char <= 0xffff) {
wchar = static_cast<wchar_t>(unicode_char);
}
return VirtualKey(VK_PACKET, wchar, unicode_char);
}
wchar_t VirtualKey::wide_char() const {
return wide_char_;
}
char32 VirtualKey::unicode_char() const {
return unicode_char_;
}
BYTE VirtualKey::virtual_key() const {
return virtual_key_;
}
class DefaultKeyboardInterface : public Win32KeyboardInterface {
public:
// [Overrides]
virtual bool IsKanaLocked(const KeyboardStatus &keyboard_state) {
return keyboard_state.IsToggled(VK_KANA);
}
// [Overrides]
virtual bool SetKeyboardState(const KeyboardStatus &keyboard_state) {
KeyboardStatus copy = keyboard_state;
const bool result = (::SetKeyboardState(copy.mutable_status()) != FALSE);
if (!result) {
const int error = ::GetLastError();
LOG(ERROR) << "SetKeyboardState failed. error = " << error;
}
return result;
}
// [Overrides]
virtual bool GetKeyboardState(KeyboardStatus *keyboard_state) {
if (keyboard_state == nullptr) {
return false;
}
const bool result =
(::GetKeyboardState(keyboard_state->mutable_status()) != FALSE);
if (!result) {
const int error = ::GetLastError();
LOG(ERROR) << "GetKeyboardState failed. error = " << error;
}
return result;
}
// [Overrides]
virtual bool AsyncIsKeyPressed(int virtual_key) {
// The highest bit represents if the key is pressed or not.
return ::GetAsyncKeyState(virtual_key) < 0;
}
// [Overrides]
virtual int ToUnicode(
__in UINT wVirtKey,
__in UINT wScanCode,
__in_bcount_opt(256) CONST BYTE *lpKeyState,
__out_ecount(cchBuff) LPWSTR pwszBuff,
__in int cchBuff,
__in UINT wFlags) {
return ::ToUnicode(
wVirtKey, wScanCode, lpKeyState, pwszBuff, cchBuff, wFlags);
}
// [Overrides]
virtual UINT SendInput(const vector<INPUT> &inputs) {
if (inputs.size() < 1) {
return 0;
}
// Unfortunately, SendInput API requires LPINPUT (NOT const INPUT *).
// This is why we make a temporary array with the same data here.
unique_ptr<INPUT[]> input_array(new INPUT[inputs.size()]);
for (size_t i = 0; i < inputs.size(); ++i) {
input_array[i] = inputs[i];
}
return ::SendInput(inputs.size(), input_array.get(), sizeof(INPUT));
}
};
Win32KeyboardInterface *Win32KeyboardInterface::CreateDefault() {
return new DefaultKeyboardInterface();
}
KeyboardStatus::KeyboardStatus() {
memset(&status_[0], 0, arraysize(status_));
}
KeyboardStatus::KeyboardStatus(const BYTE key_status[256]) {
const errno_t error = memcpy_s(
&status_[0], arraysize(status_), key_status, arraysize(status_));
if (error != NO_ERROR) {
memset(&status_[0], 0, arraysize(status_));
}
}
BYTE KeyboardStatus::GetState(int virtual_key) const {
if (virtual_key < 0 || arraysize(status_) <= virtual_key) {
DLOG(ERROR) << "index out of range. index = " << virtual_key;
return 0;
}
return status_[virtual_key];
}
void KeyboardStatus::SetState(int virtual_key, BYTE value) {
if (virtual_key < 0 || arraysize(status_) <= virtual_key) {
DLOG(ERROR) << "index out of range. index = " << virtual_key;
return;
}
status_[virtual_key] = value;
}
bool KeyboardStatus::IsToggled(int virtual_key) const {
return (GetState(virtual_key) & 0x1) == 0x1;
}
bool KeyboardStatus::IsPressed(int virtual_key) const {
return (GetState(virtual_key) & 0x80) == 0x80;
}
const BYTE * KeyboardStatus::status() const {
return status_;
}
BYTE * KeyboardStatus::mutable_status() {
return status_;
}
size_t KeyboardStatus::status_size() const {
return arraysize(status_);
}
namespace {
enum KeyModifierFlags {
kShiftPressed = (1 << 0),
kCtrlPressed = (1 << 1),
kAltPressed = (1 << 2),
kCapsLock = (1 << 3),
kKanaLock = (1 << 4),
};
// Fallback table for keys which do not generate any printable characters.
const wchar_t kNoCharGenKey[] = {
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
};
// VK_CANCEL
const wchar_t kCharForVK_03[] = {
0x0003, 0x0003, 0x0003, 0x0000, 0x0003, 0x0003, 0x0000, 0x0000,
0x0003, 0x0003, 0x0003, 0x0000, 0x0003, 0x0003, 0x0000, 0x0000,
0x0003, 0x0003, 0x0003, 0x0000, 0x0003, 0x0003, 0x0000, 0x0000,
0x0003, 0x0003, 0x0003, 0x0000, 0x0003, 0x0003, 0x0000, 0x0000,
};
// VK_BACK
const wchar_t kCharForVK_08[] = {
0x0008, 0x0008, 0x007f, 0x0000, 0x0008, 0x0008, 0x0000, 0x0000,
0x0008, 0x0008, 0x007f, 0x0000, 0x0008, 0x0008, 0x0000, 0x0000,
0x0008, 0x0008, 0x007f, 0x0000, 0x0008, 0x0008, 0x0000, 0x0000,
0x0008, 0x0008, 0x007f, 0x0000, 0x0008, 0x0008, 0x0000, 0x0000,
};
// VK_TAB
const wchar_t kCharForVK_09[] = {
0x0009, 0x0009, 0x0000, 0x0000, 0x0009, 0x0009, 0x0000, 0x0000,
0x0009, 0x0009, 0x0000, 0x0000, 0x0009, 0x0009, 0x0000, 0x0000,
0x0009, 0x0009, 0x0000, 0x0000, 0x0009, 0x0009, 0x0000, 0x0000,
0x0009, 0x0009, 0x0000, 0x0000, 0x0009, 0x0009, 0x0000, 0x0000,
};
// VK_RETURN
const wchar_t kCharForVK_0D[] = {
0x000d, 0x000d, 0x000a, 0x0000, 0x000d, 0x000d, 0x0000, 0x0000,
0x000d, 0x000d, 0x000a, 0x0000, 0x000d, 0x000d, 0x0000, 0x0000,
0x000d, 0x000d, 0x000a, 0x0000, 0x000d, 0x000d, 0x0000, 0x0000,
0x000d, 0x000d, 0x000a, 0x0000, 0x000d, 0x000d, 0x0000, 0x0000,
};
// VK_ESCAPE
const wchar_t kCharForVK_1B[] = {
0x001b, 0x001b, 0x001b, 0x0000, 0x001b, 0x001b, 0x0000, 0x0000,
0x001b, 0x001b, 0x001b, 0x0000, 0x001b, 0x001b, 0x0000, 0x0000,
0x001b, 0x001b, 0x001b, 0x0000, 0x001b, 0x001b, 0x0000, 0x0000,
0x001b, 0x001b, 0x001b, 0x0000, 0x001b, 0x001b, 0x0000, 0x0000,
};
// VK_SPACE
const wchar_t kCharForVK_20[] = {
0x0020, 0x0020, 0x0020, 0x0000, 0x0020, 0x0020, 0x0000, 0x0000,
0x0020, 0x0020, 0x0020, 0x0000, 0x0020, 0x0020, 0x0000, 0x0000,
0x0020, 0x0020, 0x0020, 0x0000, 0x0020, 0x0020, 0x0000, 0x0000,
0x0020, 0x0020, 0x0020, 0x0000, 0x0020, 0x0020, 0x0000, 0x0000,
};
// VK_0
const wchar_t kCharForVK_30[] = {
0x0030, 0x0000, 0x0000, 0x0000, 0x0030, 0x0000, 0x0000, 0x0000,
0x0030, 0x0000, 0x0000, 0x0000, 0x0030, 0x0000, 0x0000, 0x0000,
0xff9c, 0xff66, 0x0000, 0x0000, 0xff9c, 0xff66, 0x0000, 0x0000,
0xff9c, 0xff66, 0x0000, 0x0000, 0xff9c, 0xff66, 0x0000, 0x0000,
};
// VK_1
const wchar_t kCharForVK_31[] = {
0x0031, 0x0021, 0x0000, 0x0000, 0x0031, 0x0021, 0x0000, 0x0000,
0x0031, 0x0021, 0x0000, 0x0000, 0x0031, 0x0021, 0x0000, 0x0000,
0xff87, 0xff87, 0x0000, 0x0000, 0xff87, 0xff87, 0x0000, 0x0000,
0xff87, 0xff87, 0x0000, 0x0000, 0xff87, 0xff87, 0x0000, 0x0000,
};
// VK_2
const wchar_t kCharForVK_32[] = {
0x0032, 0x0022, 0x0000, 0x0000, 0x0032, 0x0022, 0x0000, 0x0000,
0x0032, 0x0022, 0x0000, 0x0000, 0x0032, 0x0022, 0x0000, 0x0000,
0xff8c, 0xff8c, 0x0000, 0x0000, 0xff8c, 0xff8c, 0x0000, 0x0000,
0xff8c, 0xff8c, 0x0000, 0x0000, 0xff8c, 0xff8c, 0x0000, 0x0000,
};
// VK_3
const wchar_t kCharForVK_33[] = {
0x0033, 0x0023, 0x0000, 0x0000, 0x0033, 0x0023, 0x0000, 0x0000,
0x0033, 0x0023, 0x0000, 0x0000, 0x0033, 0x0023, 0x0000, 0x0000,
0xff71, 0xff67, 0x0000, 0x0000, 0xff71, 0xff67, 0x0000, 0x0000,
0xff71, 0xff67, 0x0000, 0x0000, 0xff71, 0xff67, 0x0000, 0x0000,
};
// VK_4
const wchar_t kCharForVK_34[] = {
0x0034, 0x0024, 0x0000, 0x0000, 0x0034, 0x0024, 0x0000, 0x0000,
0x0034, 0x0024, 0x0000, 0x0000, 0x0034, 0x0024, 0x0000, 0x0000,
0xff73, 0xff69, 0x0000, 0x0000, 0xff73, 0xff69, 0x0000, 0x0000,
0xff73, 0xff69, 0x0000, 0x0000, 0xff73, 0xff69, 0x0000, 0x0000,
};
// VK_5
const wchar_t kCharForVK_35[] = {
0x0035, 0x0025, 0x0000, 0x0000, 0x0035, 0x0025, 0x0000, 0x0000,
0x0035, 0x0025, 0x0000, 0x0000, 0x0035, 0x0025, 0x0000, 0x0000,
0xff74, 0xff6a, 0x0000, 0x0000, 0xff74, 0xff6a, 0x0000, 0x0000,
0xff74, 0xff6a, 0x0000, 0x0000, 0xff74, 0xff6a, 0x0000, 0x0000,
};
// VK_6
const wchar_t kCharForVK_36[] = {
0x0036, 0x0026, 0x0000, 0x001e, 0x0036, 0x0026, 0x0000, 0x0000,
0x0036, 0x0026, 0x0000, 0x001e, 0x0036, 0x0026, 0x0000, 0x0000,
0xff75, 0xff6b, 0x0000, 0x001e, 0xff75, 0xff6b, 0x0000, 0x0000,
0xff75, 0xff6b, 0x0000, 0x001e, 0xff75, 0xff6b, 0x0000, 0x0000,
};
// VK_7
const wchar_t kCharForVK_37[] = {
0x0037, 0x0027, 0x0000, 0x0000, 0x0037, 0x0027, 0x0000, 0x0000,
0x0037, 0x0027, 0x0000, 0x0000, 0x0037, 0x0027, 0x0000, 0x0000,
0xff94, 0xff6c, 0x0000, 0x0000, 0xff94, 0xff6c, 0x0000, 0x0000,
0xff94, 0xff6c, 0x0000, 0x0000, 0xff94, 0xff6c, 0x0000, 0x0000,
};
// VK_8
const wchar_t kCharForVK_38[] = {
0x0038, 0x0028, 0x0000, 0x0000, 0x0038, 0x0028, 0x0000, 0x0000,
0x0038, 0x0028, 0x0000, 0x0000, 0x0038, 0x0028, 0x0000, 0x0000,
0xff95, 0xff6d, 0x0000, 0x0000, 0xff95, 0xff6d, 0x0000, 0x0000,
0xff95, 0xff6d, 0x0000, 0x0000, 0xff95, 0xff6d, 0x0000, 0x0000,
};
// VK_9
const wchar_t kCharForVK_39[] = {
0x0039, 0x0029, 0x0000, 0x0000, 0x0039, 0x0029, 0x0000, 0x0000,
0x0039, 0x0029, 0x0000, 0x0000, 0x0039, 0x0029, 0x0000, 0x0000,
0xff96, 0xff6e, 0x0000, 0x0000, 0xff96, 0xff6e, 0x0000, 0x0000,
0xff96, 0xff6e, 0x0000, 0x0000, 0xff96, 0xff6e, 0x0000, 0x0000,
};
// VK_A
const wchar_t kCharForVK_41[] = {
0x0061, 0x0041, 0x0001, 0x0001, 0x0061, 0x0041, 0x0000, 0x0000,
0x0041, 0x0061, 0x0001, 0x0001, 0x0041, 0x0061, 0x0000, 0x0000,
0xff81, 0xff81, 0x0001, 0x0001, 0xff81, 0xff81, 0x0000, 0x0000,
0xff81, 0xff81, 0x0001, 0x0001, 0xff81, 0xff81, 0x0000, 0x0000,
};
// VK_B
const wchar_t kCharForVK_42[] = {
0x0062, 0x0042, 0x0002, 0x0002, 0x0062, 0x0042, 0x0000, 0x0000,
0x0042, 0x0062, 0x0002, 0x0002, 0x0042, 0x0062, 0x0000, 0x0000,
0xff7a, 0xff7a, 0x0002, 0x0002, 0xff7a, 0xff7a, 0x0000, 0x0000,
0xff7a, 0xff7a, 0x0002, 0x0002, 0xff7a, 0xff7a, 0x0000, 0x0000,
};
// VK_C
const wchar_t kCharForVK_43[] = {
0x0063, 0x0043, 0x0003, 0x0003, 0x0063, 0x0043, 0x0000, 0x0000,
0x0043, 0x0063, 0x0003, 0x0003, 0x0043, 0x0063, 0x0000, 0x0000,
0xff7f, 0xff7f, 0x0003, 0x0003, 0xff7f, 0xff7f, 0x0000, 0x0000,
0xff7f, 0xff7f, 0x0003, 0x0003, 0xff7f, 0xff7f, 0x0000, 0x0000,
};
// VK_D
const wchar_t kCharForVK_44[] = {
0x0064, 0x0044, 0x0004, 0x0004, 0x0064, 0x0044, 0x0000, 0x0000,
0x0044, 0x0064, 0x0004, 0x0004, 0x0044, 0x0064, 0x0000, 0x0000,
0xff7c, 0xff7c, 0x0004, 0x0004, 0xff7c, 0xff7c, 0x0000, 0x0000,
0xff7c, 0xff7c, 0x0004, 0x0004, 0xff7c, 0xff7c, 0x0000, 0x0000,
};
// VK_E
const wchar_t kCharForVK_45[] = {
0x0065, 0x0045, 0x0005, 0x0005, 0x0065, 0x0045, 0x0000, 0x0000,
0x0045, 0x0065, 0x0005, 0x0005, 0x0045, 0x0065, 0x0000, 0x0000,
0xff72, 0xff68, 0x0005, 0x0005, 0xff72, 0xff68, 0x0000, 0x0000,
0xff72, 0xff68, 0x0005, 0x0005, 0xff72, 0xff68, 0x0000, 0x0000,
};
// VK_F
const wchar_t kCharForVK_46[] = {
0x0066, 0x0046, 0x0006, 0x0006, 0x0066, 0x0046, 0x0000, 0x0000,
0x0046, 0x0066, 0x0006, 0x0006, 0x0046, 0x0066, 0x0000, 0x0000,
0xff8a, 0xff8a, 0x0006, 0x0006, 0xff8a, 0xff8a, 0x0000, 0x0000,
0xff8a, 0xff8a, 0x0006, 0x0006, 0xff8a, 0xff8a, 0x0000, 0x0000,
};
// VK_G
const wchar_t kCharForVK_47[] = {
0x0067, 0x0047, 0x0007, 0x0007, 0x0067, 0x0047, 0x0000, 0x0000,
0x0047, 0x0067, 0x0007, 0x0007, 0x0047, 0x0067, 0x0000, 0x0000,
0xff77, 0xff77, 0x0007, 0x0007, 0xff77, 0xff77, 0x0000, 0x0000,
0xff77, 0xff77, 0x0007, 0x0007, 0xff77, 0xff77, 0x0000, 0x0000,
};
// VK_H
const wchar_t kCharForVK_48[] = {
0x0068, 0x0048, 0x0008, 0x0008, 0x0068, 0x0048, 0x0000, 0x0000,
0x0048, 0x0068, 0x0008, 0x0008, 0x0048, 0x0068, 0x0000, 0x0000,
0xff78, 0xff78, 0x0008, 0x0008, 0xff78, 0xff78, 0x0000, 0x0000,
0xff78, 0xff78, 0x0008, 0x0008, 0xff78, 0xff78, 0x0000, 0x0000,
};
// VK_I
const wchar_t kCharForVK_49[] = {
0x0069, 0x0049, 0x0009, 0x0009, 0x0069, 0x0049, 0x0000, 0x0000,
0x0049, 0x0069, 0x0009, 0x0009, 0x0049, 0x0069, 0x0000, 0x0000,
0xff86, 0xff86, 0x0009, 0x0009, 0xff86, 0xff86, 0x0000, 0x0000,
0xff86, 0xff86, 0x0009, 0x0009, 0xff86, 0xff86, 0x0000, 0x0000,
};
// VK_J
const wchar_t kCharForVK_4A[] = {
0x006a, 0x004a, 0x000a, 0x000a, 0x006a, 0x004a, 0x0000, 0x0000,
0x004a, 0x006a, 0x000a, 0x000a, 0x004a, 0x006a, 0x0000, 0x0000,
0xff8f, 0xff8f, 0x000a, 0x000a, 0xff8f, 0xff8f, 0x0000, 0x0000,
0xff8f, 0xff8f, 0x000a, 0x000a, 0xff8f, 0xff8f, 0x0000, 0x0000,
};
// VK_K
const wchar_t kCharForVK_4B[] = {
0x006b, 0x004b, 0x000b, 0x000b, 0x006b, 0x004b, 0x0000, 0x0000,
0x004b, 0x006b, 0x000b, 0x000b, 0x004b, 0x006b, 0x0000, 0x0000,
0xff89, 0xff89, 0x000b, 0x000b, 0xff89, 0xff89, 0x0000, 0x0000,
0xff89, 0xff89, 0x000b, 0x000b, 0xff89, 0xff89, 0x0000, 0x0000,
};
// VK_L
const wchar_t kCharForVK_4C[] = {
0x006c, 0x004c, 0x000c, 0x000c, 0x006c, 0x004c, 0x0000, 0x0000,
0x004c, 0x006c, 0x000c, 0x000c, 0x004c, 0x006c, 0x0000, 0x0000,
0xff98, 0xff98, 0x000c, 0x000c, 0xff98, 0xff98, 0x0000, 0x0000,
0xff98, 0xff98, 0x000c, 0x000c, 0xff98, 0xff98, 0x0000, 0x0000,
};
// VK_M
const wchar_t kCharForVK_4D[] = {
0x006d, 0x004d, 0x000d, 0x000d, 0x006d, 0x004d, 0x0000, 0x0000,
0x004d, 0x006d, 0x000d, 0x000d, 0x004d, 0x006d, 0x0000, 0x0000,
0xff93, 0xff93, 0x000d, 0x000d, 0xff93, 0xff93, 0x0000, 0x0000,
0xff93, 0xff93, 0x000d, 0x000d, 0xff93, 0xff93, 0x0000, 0x0000,
};
// VK_N
const wchar_t kCharForVK_4E[] = {
0x006e, 0x004e, 0x000e, 0x000e, 0x006e, 0x004e, 0x0000, 0x0000,
0x004e, 0x006e, 0x000e, 0x000e, 0x004e, 0x006e, 0x0000, 0x0000,
0xff90, 0xff90, 0x000e, 0x000e, 0xff90, 0xff90, 0x0000, 0x0000,
0xff90, 0xff90, 0x000e, 0x000e, 0xff90, 0xff90, 0x0000, 0x0000,
};
// VK_O
const wchar_t kCharForVK_4F[] = {
0x006f, 0x004f, 0x000f, 0x000f, 0x006f, 0x004f, 0x0000, 0x0000,
0x004f, 0x006f, 0x000f, 0x000f, 0x004f, 0x006f, 0x0000, 0x0000,
0xff97, 0xff97, 0x000f, 0x000f, 0xff97, 0xff97, 0x0000, 0x0000,
0xff97, 0xff97, 0x000f, 0x000f, 0xff97, 0xff97, 0x0000, 0x0000,
};
// VK_P
const wchar_t kCharForVK_50[] = {
0x0070, 0x0050, 0x0010, 0x0010, 0x0070, 0x0050, 0x0000, 0x0000,
0x0050, 0x0070, 0x0010, 0x0010, 0x0050, 0x0070, 0x0000, 0x0000,
0xff7e, 0xff7e, 0x0010, 0x0010, 0xff7e, 0xff7e, 0x0000, 0x0000,
0xff7e, 0xff7e, 0x0010, 0x0010, 0xff7e, 0xff7e, 0x0000, 0x0000,
};
// VK_Q
const wchar_t kCharForVK_51[] = {
0x0071, 0x0051, 0x0011, 0x0011, 0x0071, 0x0051, 0x0000, 0x0000,
0x0051, 0x0071, 0x0011, 0x0011, 0x0051, 0x0071, 0x0000, 0x0000,
0xff80, 0xff80, 0x0011, 0x0011, 0xff80, 0xff80, 0x0000, 0x0000,
0xff80, 0xff80, 0x0011, 0x0011, 0xff80, 0xff80, 0x0000, 0x0000,
};
// VK_R
const wchar_t kCharForVK_52[] = {
0x0072, 0x0052, 0x0012, 0x0012, 0x0072, 0x0052, 0x0000, 0x0000,
0x0052, 0x0072, 0x0012, 0x0012, 0x0052, 0x0072, 0x0000, 0x0000,
0xff7d, 0xff7d, 0x0012, 0x0012, 0xff7d, 0xff7d, 0x0000, 0x0000,
0xff7d, 0xff7d, 0x0012, 0x0012, 0xff7d, 0xff7d, 0x0000, 0x0000,
};
// VK_S
const wchar_t kCharForVK_53[] = {
0x0073, 0x0053, 0x0013, 0x0013, 0x0073, 0x0053, 0x0000, 0x0000,
0x0053, 0x0073, 0x0013, 0x0013, 0x0053, 0x0073, 0x0000, 0x0000,
0xff84, 0xff84, 0x0013, 0x0013, 0xff84, 0xff84, 0x0000, 0x0000,
0xff84, 0xff84, 0x0013, 0x0013, 0xff84, 0xff84, 0x0000, 0x0000,
};
// VK_T
const wchar_t kCharForVK_54[] = {
0x0074, 0x0054, 0x0014, 0x0014, 0x0074, 0x0054, 0x0000, 0x0000,
0x0054, 0x0074, 0x0014, 0x0014, 0x0054, 0x0074, 0x0000, 0x0000,
0xff76, 0xff76, 0x0014, 0x0014, 0xff76, 0xff76, 0x0000, 0x0000,
0xff76, 0xff76, 0x0014, 0x0014, 0xff76, 0xff76, 0x0000, 0x0000,
};
// VK_U
const wchar_t kCharForVK_55[] = {
0x0075, 0x0055, 0x0015, 0x0015, 0x0075, 0x0055, 0x0000, 0x0000,
0x0055, 0x0075, 0x0015, 0x0015, 0x0055, 0x0075, 0x0000, 0x0000,
0xff85, 0xff85, 0x0015, 0x0015, 0xff85, 0xff85, 0x0000, 0x0000,
0xff85, 0xff85, 0x0015, 0x0015, 0xff85, 0xff85, 0x0000, 0x0000,
};
// VK_V
const wchar_t kCharForVK_56[] = {
0x0076, 0x0056, 0x0016, 0x0016, 0x0076, 0x0056, 0x0000, 0x0000,
0x0056, 0x0076, 0x0016, 0x0016, 0x0056, 0x0076, 0x0000, 0x0000,
0xff8b, 0xff8b, 0x0016, 0x0016, 0xff8b, 0xff8b, 0x0000, 0x0000,
0xff8b, 0xff8b, 0x0016, 0x0016, 0xff8b, 0xff8b, 0x0000, 0x0000,
};
// VK_W
const wchar_t kCharForVK_57[] = {
0x0077, 0x0057, 0x0017, 0x0017, 0x0077, 0x0057, 0x0000, 0x0000,
0x0057, 0x0077, 0x0017, 0x0017, 0x0057, 0x0077, 0x0000, 0x0000,
0xff83, 0xff83, 0x0017, 0x0017, 0xff83, 0xff83, 0x0000, 0x0000,
0xff83, 0xff83, 0x0017, 0x0017, 0xff83, 0xff83, 0x0000, 0x0000,
};
// VK_X
const wchar_t kCharForVK_58[] = {
0x0078, 0x0058, 0x0018, 0x0018, 0x0078, 0x0058, 0x0000, 0x0000,
0x0058, 0x0078, 0x0018, 0x0018, 0x0058, 0x0078, 0x0000, 0x0000,
0xff7b, 0xff7b, 0x0018, 0x0018, 0xff7b, 0xff7b, 0x0000, 0x0000,
0xff7b, 0xff7b, 0x0018, 0x0018, 0xff7b, 0xff7b, 0x0000, 0x0000,
};
// VK_Y
const wchar_t kCharForVK_59[] = {
0x0079, 0x0059, 0x0019, 0x0019, 0x0079, 0x0059, 0x0000, 0x0000,
0x0059, 0x0079, 0x0019, 0x0019, 0x0059, 0x0079, 0x0000, 0x0000,
0xff9d, 0xff9d, 0x0019, 0x0019, 0xff9d, 0xff9d, 0x0000, 0x0000,
0xff9d, 0xff9d, 0x0019, 0x0019, 0xff9d, 0xff9d, 0x0000, 0x0000,
};
// VK_Z
const wchar_t kCharForVK_5A[] = {
0x007a, 0x005a, 0x001a, 0x001a, 0x007a, 0x005a, 0x0000, 0x0000,
0x005a, 0x007a, 0x001a, 0x001a, 0x005a, 0x007a, 0x0000, 0x0000,
0xff82, 0xff6f, 0x001a, 0x001a, 0xff82, 0xff6f, 0x0000, 0x0000,
0xff82, 0xff6f, 0x001a, 0x001a, 0xff82, 0xff6f, 0x0000, 0x0000,
};
// VK_NUMPAD0
const wchar_t kCharForVK_60[] = {
0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
};
// VK_NUMPAD0 (When menu is active)
const wchar_t kCharForVK_60_MenuActive[] = {
0x0030, 0x0000, 0x0000, 0x0000, 0x0030, 0x0000, 0x0000, 0x0000,
0x0030, 0x0000, 0x0000, 0x0000, 0x0030, 0x0000, 0x0000, 0x0000,
0x0030, 0x0000, 0x0000, 0x0000, 0x0030, 0x0000, 0x0000, 0x0000,
0x0030, 0x0000, 0x0000, 0x0000, 0x0030, 0x0000, 0x0000, 0x0000,
};
// VK_NUMPAD1
const wchar_t kCharForVK_61[] = {
0x0031, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0031, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0031, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0031, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
};
// VK_NUMPAD1 (When menu is active)
const wchar_t kCharForVK_61_MenuActive[] = {
0x0031, 0x0000, 0x0000, 0x0000, 0x0031, 0x0000, 0x0000, 0x0000,
0x0031, 0x0000, 0x0000, 0x0000, 0x0031, 0x0000, 0x0000, 0x0000,
0x0031, 0x0000, 0x0000, 0x0000, 0x0031, 0x0000, 0x0000, 0x0000,
0x0031, 0x0000, 0x0000, 0x0000, 0x0031, 0x0000, 0x0000, 0x0000,
};
// VK_NUMPAD2
const wchar_t kCharForVK_62[] = {
0x0032, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0032, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0032, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0032, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
};
// VK_NUMPAD2 (When menu is active)
const wchar_t kCharForVK_62_MenuActive[] = {
0x0032, 0x0000, 0x0000, 0x0000, 0x0032, 0x0000, 0x0000, 0x0000,
0x0032, 0x0000, 0x0000, 0x0000, 0x0032, 0x0000, 0x0000, 0x0000,
0x0032, 0x0000, 0x0000, 0x0000, 0x0032, 0x0000, 0x0000, 0x0000,
0x0032, 0x0000, 0x0000, 0x0000, 0x0032, 0x0000, 0x0000, 0x0000,
};
// VK_NUMPAD3
const wchar_t kCharForVK_63[] = {
0x0033, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0033, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0033, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0033, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
};
// VK_NUMPAD3 (When menu is active)
const wchar_t kCharForVK_63_MenuActive[] = {
0x0033, 0x0000, 0x0000, 0x0000, 0x0033, 0x0000, 0x0000, 0x0000,
0x0033, 0x0000, 0x0000, 0x0000, 0x0033, 0x0000, 0x0000, 0x0000,
0x0033, 0x0000, 0x0000, 0x0000, 0x0033, 0x0000, 0x0000, 0x0000,
0x0033, 0x0000, 0x0000, 0x0000, 0x0033, 0x0000, 0x0000, 0x0000,
};
// VK_NUMPAD4
const wchar_t kCharForVK_64[] = {
0x0034, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0034, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0034, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0034, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
};
// VK_NUMPAD4 (When menu is active)
const wchar_t kCharForVK_64_MenuActive[] = {
0x0034, 0x0000, 0x0000, 0x0000, 0x0034, 0x0000, 0x0000, 0x0000,
0x0034, 0x0000, 0x0000, 0x0000, 0x0034, 0x0000, 0x0000, 0x0000,
0x0034, 0x0000, 0x0000, 0x0000, 0x0034, 0x0000, 0x0000, 0x0000,
0x0034, 0x0000, 0x0000, 0x0000, 0x0034, 0x0000, 0x0000, 0x0000,
};
// VK_NUMPAD5
const wchar_t kCharForVK_65[] = {
0x0035, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0035, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0035, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0035, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
};
// VK_NUMPAD5 (When menu is active)
const wchar_t kCharForVK_65_MenuActive[] = {
0x0035, 0x0000, 0x0000, 0x0000, 0x0035, 0x0000, 0x0000, 0x0000,
0x0035, 0x0000, 0x0000, 0x0000, 0x0035, 0x0000, 0x0000, 0x0000,
0x0035, 0x0000, 0x0000, 0x0000, 0x0035, 0x0000, 0x0000, 0x0000,
0x0035, 0x0000, 0x0000, 0x0000, 0x0035, 0x0000, 0x0000, 0x0000,
};
// VK_NUMPAD6
const wchar_t kCharForVK_66[] = {
0x0036, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0036, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0036, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0036, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
};
// VK_NUMPAD6 (When menu is active)
const wchar_t kCharForVK_66_MenuActive[] = {
0x0036, 0x0000, 0x0000, 0x0000, 0x0036, 0x0000, 0x0000, 0x0000,
0x0036, 0x0000, 0x0000, 0x0000, 0x0036, 0x0000, 0x0000, 0x0000,
0x0036, 0x0000, 0x0000, 0x0000, 0x0036, 0x0000, 0x0000, 0x0000,
0x0036, 0x0000, 0x0000, 0x0000, 0x0036, 0x0000, 0x0000, 0x0000,
};
// VK_NUMPAD7
const wchar_t kCharForVK_67[] = {
0x0037, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0037, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0037, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0037, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
};
// VK_NUMPAD7 (When menu is active)
const wchar_t kCharForVK_67_MenuActive[] = {
0x0037, 0x0000, 0x0000, 0x0000, 0x0037, 0x0000, 0x0000, 0x0000,
0x0037, 0x0000, 0x0000, 0x0000, 0x0037, 0x0000, 0x0000, 0x0000,
0x0037, 0x0000, 0x0000, 0x0000, 0x0037, 0x0000, 0x0000, 0x0000,
0x0037, 0x0000, 0x0000, 0x0000, 0x0037, 0x0000, 0x0000, 0x0000,
};
// VK_NUMPAD8
const wchar_t kCharForVK_68[] = {
0x0038, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0038, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0038, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0038, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
};
// VK_NUMPAD8 (When menu is active)
const wchar_t kCharForVK_68_MenuActive[] = {
0x0038, 0x0000, 0x0000, 0x0000, 0x0038, 0x0000, 0x0000, 0x0000,
0x0038, 0x0000, 0x0000, 0x0000, 0x0038, 0x0000, 0x0000, 0x0000,
0x0038, 0x0000, 0x0000, 0x0000, 0x0038, 0x0000, 0x0000, 0x0000,
0x0038, 0x0000, 0x0000, 0x0000, 0x0038, 0x0000, 0x0000, 0x0000,
};
// VK_NUMPAD9
const wchar_t kCharForVK_69[] = {
0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
};
// VK_NUMPAD9 (When menu is active)
const wchar_t kCharForVK_69_MenuActive[] = {
0x0039, 0x0000, 0x0000, 0x0000, 0x0039, 0x0000, 0x0000, 0x0000,
0x0039, 0x0000, 0x0000, 0x0000, 0x0039, 0x0000, 0x0000, 0x0000,
0x0039, 0x0000, 0x0000, 0x0000, 0x0039, 0x0000, 0x0000, 0x0000,
0x0039, 0x0000, 0x0000, 0x0000, 0x0039, 0x0000, 0x0000, 0x0000,
};
// VK_MULTIPLY
const wchar_t kCharForVK_6A[] = {
0x002a, 0x002a, 0x0000, 0x0000, 0x002a, 0x002a, 0x0000, 0x0000,
0x002a, 0x002a, 0x0000, 0x0000, 0x002a, 0x002a, 0x0000, 0x0000,
0x002a, 0x002a, 0x0000, 0x0000, 0x002a, 0x002a, 0x0000, 0x0000,
0x002a, 0x002a, 0x0000, 0x0000, 0x002a, 0x002a, 0x0000, 0x0000,
};
// VK_ADD
const wchar_t kCharForVK_6B[] = {
0x002b, 0x002b, 0x0000, 0x0000, 0x002b, 0x002b, 0x0000, 0x0000,
0x002b, 0x002b, 0x0000, 0x0000, 0x002b, 0x002b, 0x0000, 0x0000,
0x002b, 0x002b, 0x0000, 0x0000, 0x002b, 0x002b, 0x0000, 0x0000,
0x002b, 0x002b, 0x0000, 0x0000, 0x002b, 0x002b, 0x0000, 0x0000,
};
// VK_SUBTRACT
const wchar_t kCharForVK_6D[] = {
0x002d, 0x002d, 0x0000, 0x0000, 0x002d, 0x002d, 0x0000, 0x0000,
0x002d, 0x002d, 0x0000, 0x0000, 0x002d, 0x002d, 0x0000, 0x0000,
0x002d, 0x002d, 0x0000, 0x0000, 0x002d, 0x002d, 0x0000, 0x0000,
0x002d, 0x002d, 0x0000, 0x0000, 0x002d, 0x002d, 0x0000, 0x0000,
};
// VK_DECIMAL
const wchar_t kCharForVK_6E[] = {
0x002e, 0x002e, 0x0000, 0x0000, 0x002e, 0x002e, 0x0000, 0x0000,
0x002e, 0x002e, 0x0000, 0x0000, 0x002e, 0x002e, 0x0000, 0x0000,
0x002e, 0x002e, 0x0000, 0x0000, 0x002e, 0x002e, 0x0000, 0x0000,
0x002e, 0x002e, 0x0000, 0x0000, 0x002e, 0x002e, 0x0000, 0x0000,
};
// VK_DIVIDE
const wchar_t kCharForVK_6F[] = {
0x002f, 0x002f, 0x0000, 0x0000, 0x002f, 0x002f, 0x0000, 0x0000,
0x002f, 0x002f, 0x0000, 0x0000, 0x002f, 0x002f, 0x0000, 0x0000,
0x002f, 0x002f, 0x0000, 0x0000, 0x002f, 0x002f, 0x0000, 0x0000,
0x002f, 0x002f, 0x0000, 0x0000, 0x002f, 0x002f, 0x0000, 0x0000,
};
// VK_OEM_1
const wchar_t kCharForVK_BA[] = {
0x003a, 0x002a, 0x0000, 0x0000, 0x003a, 0x002a, 0x0000, 0x0000,
0x003a, 0x002a, 0x0000, 0x0000, 0x003a, 0x002a, 0x0000, 0x0000,
0xff79, 0xff79, 0x0000, 0x0000, 0xff79, 0xff79, 0x0000, 0x0000,
0xff79, 0xff79, 0x0000, 0x0000, 0xff79, 0xff79, 0x0000, 0x0000,
};
// VK_OEM_PLUS
const wchar_t kCharForVK_BB[] = {
0x003b, 0x002b, 0x0000, 0x0000, 0x003b, 0x002b, 0x0000, 0x0000,
0x003b, 0x002b, 0x0000, 0x0000, 0x003b, 0x002b, 0x0000, 0x0000,
0xff9a, 0xff9a, 0x0000, 0x0000, 0xff9a, 0xff9a, 0x0000, 0x0000,
0xff9a, 0xff9a, 0x0000, 0x0000, 0xff9a, 0xff9a, 0x0000, 0x0000,
};
// VK_OEM_COMMA
const wchar_t kCharForVK_BC[] = {
0x002c, 0x003c, 0x0000, 0x0000, 0x002c, 0x003c, 0x0000, 0x0000,
0x002c, 0x003c, 0x0000, 0x0000, 0x002c, 0x003c, 0x0000, 0x0000,
0xff88, 0xff64, 0x0000, 0x0000, 0xff88, 0xff64, 0x0000, 0x0000,
0xff88, 0xff64, 0x0000, 0x0000, 0xff88, 0xff64, 0x0000, 0x0000,
};
// VK_OEM_MINUS
const wchar_t kCharForVK_BD[] = {
0x002d, 0x003d, 0x0000, 0x001f, 0x002d, 0x003d, 0x0000, 0x0000,
0x002d, 0x003d, 0x0000, 0x001f, 0x002d, 0x003d, 0x0000, 0x0000,
0xff8e, 0xff8e, 0x0000, 0x001f, 0xff8e, 0xff8e, 0x0000, 0x0000,
0xff8e, 0xff8e, 0x0000, 0x001f, 0xff8e, 0xff8e, 0x0000, 0x0000,
};
// VK_OEM_PERIOD
const wchar_t kCharForVK_BE[] = {
0x002e, 0x003e, 0x0000, 0x0000, 0x002e, 0x003e, 0x0000, 0x0000,
0x002e, 0x003e, 0x0000, 0x0000, 0x002e, 0x003e, 0x0000, 0x0000,
0xff99, 0xff61, 0x0000, 0x0000, 0xff99, 0xff61, 0x0000, 0x0000,
0xff99, 0xff61, 0x0000, 0x0000, 0xff99, 0xff61, 0x0000, 0x0000,
};
// VK_OEM_2
const wchar_t kCharForVK_BF[] = {
0x002f, 0x003f, 0x0000, 0x0000, 0x002f, 0x003f, 0x0000, 0x0000,
0x002f, 0x003f, 0x0000, 0x0000, 0x002f, 0x003f, 0x0000, 0x0000,
0xff92, 0xff65, 0x0000, 0x0000, 0xff92, 0xff65, 0x0000, 0x0000,
0xff92, 0xff65, 0x0000, 0x0000, 0xff92, 0xff65, 0x0000, 0x0000,
};
// VK_OEM_3
const wchar_t kCharForVK_C0[] = {
0x0040, 0x0060, 0x0000, 0x0000, 0x0040, 0x0060, 0x0000, 0x0000,
0x0040, 0x0060, 0x0000, 0x0000, 0x0040, 0x0060, 0x0000, 0x0000,
0xff9e, 0xff9e, 0x0000, 0x0000, 0xff9e, 0xff9e, 0x0000, 0x0000,
0xff9e, 0xff9e, 0x0000, 0x0000, 0xff9e, 0xff9e, 0x0000, 0x0000,
};
// VK_OEM_4
const wchar_t kCharForVK_DB[] = {
0x005b, 0x007b, 0x001b, 0x0000, 0x005b, 0x007b, 0x0000, 0x0000,
0x005b, 0x007b, 0x001b, 0x0000, 0x005b, 0x007b, 0x0000, 0x0000,
0xff9f, 0xff62, 0x001b, 0x0000, 0xff9f, 0xff62, 0x0000, 0x0000,
0xff9f, 0xff62, 0x001b, 0x0000, 0xff9f, 0xff62, 0x0000, 0x0000,
};
// VK_OEM_5
const wchar_t kCharForVK_DC[] = {
0x005c, 0x007c, 0x001c, 0x0000, 0x005c, 0x007c, 0x0000, 0x0000,
0x005c, 0x007c, 0x001c, 0x0000, 0x005c, 0x007c, 0x0000, 0x0000,
0xff70, 0xff70, 0x001c, 0x0000, 0xff70, 0xff70, 0x0000, 0x0000,
0xff70, 0xff70, 0x001c, 0x0000, 0xff70, 0xff70, 0x0000, 0x0000,
};
// VK_OEM_6
const wchar_t kCharForVK_DD[] = {
0x005d, 0x007d, 0x001d, 0x0000, 0x005d, 0x007d, 0x0000, 0x0000,
0x005d, 0x007d, 0x001d, 0x0000, 0x005d, 0x007d, 0x0000, 0x0000,
0xff91, 0xff63, 0x001d, 0x0000, 0xff91, 0xff63, 0x0000, 0x0000,
0xff91, 0xff63, 0x001d, 0x0000, 0xff91, 0xff63, 0x0000, 0x0000,
};
// VK_OEM_7
const wchar_t kCharForVK_DE[] = {
0x005e, 0x007e, 0x0000, 0x0000, 0x005e, 0x007e, 0x0000, 0x0000,
0x005e, 0x007e, 0x0000, 0x0000, 0x005e, 0x007e, 0x0000, 0x0000,
0xff8d, 0xff8d, 0x0000, 0x0000, 0xff8d, 0xff8d, 0x0000, 0x0000,
0xff8d, 0xff8d, 0x0000, 0x0000, 0xff8d, 0xff8d, 0x0000, 0x0000,
};
// VK_OEM_102
const wchar_t kCharForVK_E2[] = {
0x005c, 0x005f, 0x001c, 0x0000, 0x005c, 0x005f, 0x0000, 0x0000,
0x005c, 0x005f, 0x001c, 0x0000, 0x005c, 0x005f, 0x0000, 0x0000,
0xff9b, 0xff9b, 0x001c, 0x0000, 0xff9b, 0xff9b, 0x0000, 0x0000,
0xff9b, 0xff9b, 0x001c, 0x0000, 0xff9b, 0xff9b, 0x0000, 0x0000,
};
const wchar_t *kCharTable[] = {
kNoCharGenKey,
kNoCharGenKey, // VK_LBUTTON
kNoCharGenKey, // VK_RBUTTON
kCharForVK_03, // VK_CANCEL
kNoCharGenKey, // VK_MBUTTON
kNoCharGenKey, // VK_XBUTTON1
kNoCharGenKey, // VK_XBUTTON2
kNoCharGenKey,
kCharForVK_08, // VK_BACK
kCharForVK_09, // VK_TAB
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey, // VK_CLEAR
kCharForVK_0D, // VK_RETURN
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey, // VK_SHIFT
kNoCharGenKey, // VK_CONTROL
kNoCharGenKey, // VK_MENU
kNoCharGenKey, // VK_PAUSE
kNoCharGenKey, // VK_CAPITAL
kNoCharGenKey, // VK_HANGUL, VK_KANA
kNoCharGenKey,
kNoCharGenKey, // VK_JUNJA
kNoCharGenKey, // VK_FINAL
kNoCharGenKey, // VK_HANJA, VK_KANJI
kNoCharGenKey,
kCharForVK_1B, // VK_ESCAPE
kNoCharGenKey, // VK_CONVERT
kNoCharGenKey, // VK_NONCONVERT
kNoCharGenKey, // VK_ACCEPT
kNoCharGenKey, // VK_MODECHANGE
kCharForVK_20, // VK_SPACE
kNoCharGenKey, // VK_PRIOR
kNoCharGenKey, // VK_NEXT
kNoCharGenKey, // VK_END
kNoCharGenKey, // VK_HOME
kNoCharGenKey, // VK_LEFT
kNoCharGenKey, // VK_UP
kNoCharGenKey, // VK_RIGHT
kNoCharGenKey, // VK_DOWN
kNoCharGenKey, // VK_SELECT
kNoCharGenKey, // VK_PRINT
kNoCharGenKey, // VK_EXECUTE
kNoCharGenKey, // VK_SNAPSHOT
kNoCharGenKey, // VK_INSERT
kNoCharGenKey, // VK_DELETE
kNoCharGenKey, // VK_HELP
kCharForVK_30, // VK_0
kCharForVK_31, // VK_1
kCharForVK_32, // VK_2
kCharForVK_33, // VK_3
kCharForVK_34, // VK_4
kCharForVK_35, // VK_5
kCharForVK_36, // VK_6
kCharForVK_37, // VK_7
kCharForVK_38, // VK_8
kCharForVK_39, // VK_9
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kCharForVK_41, // VK_A
kCharForVK_42, // VK_B
kCharForVK_43, // VK_C
kCharForVK_44, // VK_D
kCharForVK_45, // VK_E
kCharForVK_46, // VK_F
kCharForVK_47, // VK_G
kCharForVK_48, // VK_H
kCharForVK_49, // VK_I
kCharForVK_4A, // VK_J
kCharForVK_4B, // VK_K
kCharForVK_4C, // VK_L
kCharForVK_4D, // VK_M
kCharForVK_4E, // VK_N
kCharForVK_4F, // VK_O
kCharForVK_50, // VK_P
kCharForVK_51, // VK_Q
kCharForVK_52, // VK_R
kCharForVK_53, // VK_S
kCharForVK_54, // VK_T
kCharForVK_55, // VK_U
kCharForVK_56, // VK_V
kCharForVK_57, // VK_W
kCharForVK_58, // VK_X
kCharForVK_59, // VK_Y
kCharForVK_5A, // VK_Z
kNoCharGenKey, // VK_LWIN
kNoCharGenKey, // VK_RWIN
kNoCharGenKey, // VK_APPS
kNoCharGenKey,
kNoCharGenKey, // VK_SLEEP
kCharForVK_60, // VK_NUMPAD0
kCharForVK_61, // VK_NUMPAD1
kCharForVK_62, // VK_NUMPAD2
kCharForVK_63, // VK_NUMPAD3
kCharForVK_64, // VK_NUMPAD4
kCharForVK_65, // VK_NUMPAD5
kCharForVK_66, // VK_NUMPAD6
kCharForVK_67, // VK_NUMPAD7
kCharForVK_68, // VK_NUMPAD8
kCharForVK_69, // VK_NUMPAD9
kCharForVK_6A, // VK_MULTIPLY
kCharForVK_6B, // VK_ADD
kNoCharGenKey, // VK_SEPARATOR
kCharForVK_6D, // VK_SUBTRACT
kCharForVK_6E, // VK_DECIMAL
kCharForVK_6F, // VK_DIVIDE
kNoCharGenKey, // VK_F1
kNoCharGenKey, // VK_F2
kNoCharGenKey, // VK_F3
kNoCharGenKey, // VK_F4
kNoCharGenKey, // VK_F5
kNoCharGenKey, // VK_F6
kNoCharGenKey, // VK_F7
kNoCharGenKey, // VK_F8
kNoCharGenKey, // VK_F9
kNoCharGenKey, // VK_F10
kNoCharGenKey, // VK_F11
kNoCharGenKey, // VK_F12
kNoCharGenKey, // VK_F13
kNoCharGenKey, // VK_F14
kNoCharGenKey, // VK_F15
kNoCharGenKey, // VK_F16
kNoCharGenKey, // VK_F17
kNoCharGenKey, // VK_F18
kNoCharGenKey, // VK_F19
kNoCharGenKey, // VK_F20
kNoCharGenKey, // VK_F21
kNoCharGenKey, // VK_F22
kNoCharGenKey, // VK_F23
kNoCharGenKey, // VK_F24
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey, // VK_NUMLOCK
kNoCharGenKey, // VK_SCROLL
kNoCharGenKey, // VK_OEM_FJ_JISHO, VK_OEM_NEC_EQUAL
kNoCharGenKey, // VK_OEM_FJ_MASSHOU
kNoCharGenKey, // VK_OEM_FJ_TOUROKU
kNoCharGenKey, // VK_OEM_FJ_LOYA
kNoCharGenKey, // VK_OEM_FJ_ROYA
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey, // VK_LSHIFT
kNoCharGenKey, // VK_RSHIFT
kNoCharGenKey, // VK_LCONTROL
kNoCharGenKey, // VK_RCONTROL
kNoCharGenKey, // VK_LMENU
kNoCharGenKey, // VK_RMENU
kNoCharGenKey, // VK_BROWSER_BACK
kNoCharGenKey, // VK_BROWSER_FORWARD
kNoCharGenKey, // VK_BROWSER_REFRESH
kNoCharGenKey, // VK_BROWSER_STOP
kNoCharGenKey, // VK_BROWSER_SEARCH
kNoCharGenKey, // VK_BROWSER_FAVORITES
kNoCharGenKey, // VK_BROWSER_HOME
kNoCharGenKey, // VK_VOLUME_MUTE
kNoCharGenKey, // VK_VOLUME_DOWN
kNoCharGenKey, // VK_VOLUME_UP
kNoCharGenKey, // VK_MEDIA_NEXT_TRACK
kNoCharGenKey, // VK_MEDIA_PREV_TRACK
kNoCharGenKey, // VK_MEDIA_STOP
kNoCharGenKey, // VK_MEDIA_PLAY_PAUSE
kNoCharGenKey, // VK_LAUNCH_MAIL
kNoCharGenKey, // VK_LAUNCH_MEDIA_SELECT
kNoCharGenKey, // VK_LAUNCH_APP1
kNoCharGenKey, // VK_LAUNCH_APP2
kNoCharGenKey,
kNoCharGenKey,
kCharForVK_BA, // VK_OEM_1
kCharForVK_BB, // VK_OEM_PLUS
kCharForVK_BC, // VK_OEM_COMMA
kCharForVK_BD, // VK_OEM_MINUS
kCharForVK_BE, // VK_OEM_PERIOD
kCharForVK_BF, // VK_OEM_2
kCharForVK_C0, // VK_OEM_3
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kCharForVK_DB, // VK_OEM_4
kCharForVK_DC, // VK_OEM_5
kCharForVK_DD, // VK_OEM_6
kCharForVK_DE, // VK_OEM_7
kNoCharGenKey, // VK_OEM_8
kNoCharGenKey,
kNoCharGenKey, // VK_OEM_AX
kCharForVK_E2, // VK_OEM_102
kNoCharGenKey, // VK_ICO_HELP
kNoCharGenKey, // VK_ICO_00
kNoCharGenKey, // VK_PROCESSKEY
kNoCharGenKey, // VK_ICO_CLEAR
kNoCharGenKey, // VK_PACKET
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey, // VK_DBE_ALPHANUMERIC
kNoCharGenKey, // VK_DBE_KATAKANA
kNoCharGenKey, // VK_DBE_HIRAGANA
kNoCharGenKey, // VK_DBE_SBCSCHAR
kNoCharGenKey, // VK_DBE_DBCSCHAR
kNoCharGenKey, // VK_DBE_ROMAN
kNoCharGenKey, // VK_DBE_NOROMAN
kNoCharGenKey, // VK_DBE_ENTERWORDREGISTERMODE
kNoCharGenKey, // VK_DBE_ENTERIMECONFIGMODE
kNoCharGenKey, // VK_DBE_FLUSHSTRING
kNoCharGenKey, // VK_DBE_CODEINPUT
kNoCharGenKey, // VK_DBE_NOCODEINPUT
kNoCharGenKey, // VK_DBE_DETERMINESTRING
kNoCharGenKey, // VK_DBE_ENTERDLGCONVERSIONMODE
kNoCharGenKey,
kNoCharGenKey,
};
const wchar_t *kCharTableMenuActive[] = {
kNoCharGenKey,
kNoCharGenKey, // VK_LBUTTON
kNoCharGenKey, // VK_RBUTTON
kCharForVK_03, // VK_CANCEL
kNoCharGenKey, // VK_MBUTTON
kNoCharGenKey, // VK_XBUTTON1
kNoCharGenKey, // VK_XBUTTON2
kNoCharGenKey,
kCharForVK_08, // VK_BACK
kCharForVK_09, // VK_TAB
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey, // VK_CLEAR
kCharForVK_0D, // VK_RETURN
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey, // VK_SHIFT
kNoCharGenKey, // VK_CONTROL
kNoCharGenKey, // VK_MENU
kNoCharGenKey, // VK_PAUSE
kNoCharGenKey, // VK_CAPITAL
kNoCharGenKey, // VK_HANGUL, VK_KANA
kNoCharGenKey,
kNoCharGenKey, // VK_JUNJA
kNoCharGenKey, // VK_FINAL
kNoCharGenKey, // VK_HANJA, VK_KANJI
kNoCharGenKey,
kCharForVK_1B, // VK_ESCAPE
kNoCharGenKey, // VK_CONVERT
kNoCharGenKey, // VK_NONCONVERT
kNoCharGenKey, // VK_ACCEPT
kNoCharGenKey, // VK_MODECHANGE
kCharForVK_20, // VK_SPACE
kNoCharGenKey, // VK_PRIOR
kNoCharGenKey, // VK_NEXT
kNoCharGenKey, // VK_END
kNoCharGenKey, // VK_HOME
kNoCharGenKey, // VK_LEFT
kNoCharGenKey, // VK_UP
kNoCharGenKey, // VK_RIGHT
kNoCharGenKey, // VK_DOWN
kNoCharGenKey, // VK_SELECT
kNoCharGenKey, // VK_PRINT
kNoCharGenKey, // VK_EXECUTE
kNoCharGenKey, // VK_SNAPSHOT
kNoCharGenKey, // VK_INSERT
kNoCharGenKey, // VK_DELETE
kNoCharGenKey, // VK_HELP
kCharForVK_30, // VK_0
kCharForVK_31, // VK_1
kCharForVK_32, // VK_2
kCharForVK_33, // VK_3
kCharForVK_34, // VK_4
kCharForVK_35, // VK_5
kCharForVK_36, // VK_6
kCharForVK_37, // VK_7
kCharForVK_38, // VK_8
kCharForVK_39, // VK_9
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kCharForVK_41, // VK_A
kCharForVK_42, // VK_B
kCharForVK_43, // VK_C
kCharForVK_44, // VK_D
kCharForVK_45, // VK_E
kCharForVK_46, // VK_F
kCharForVK_47, // VK_G
kCharForVK_48, // VK_H
kCharForVK_49, // VK_I
kCharForVK_4A, // VK_J
kCharForVK_4B, // VK_K
kCharForVK_4C, // VK_L
kCharForVK_4D, // VK_M
kCharForVK_4E, // VK_N
kCharForVK_4F, // VK_O
kCharForVK_50, // VK_P
kCharForVK_51, // VK_Q
kCharForVK_52, // VK_R
kCharForVK_53, // VK_S
kCharForVK_54, // VK_T
kCharForVK_55, // VK_U
kCharForVK_56, // VK_V
kCharForVK_57, // VK_W
kCharForVK_58, // VK_X
kCharForVK_59, // VK_Y
kCharForVK_5A, // VK_Z
kNoCharGenKey, // VK_LWIN
kNoCharGenKey, // VK_RWIN
kNoCharGenKey, // VK_APPS
kNoCharGenKey,
kNoCharGenKey, // VK_SLEEP
kCharForVK_60_MenuActive, // VK_NUMPAD0
kCharForVK_61_MenuActive, // VK_NUMPAD1
kCharForVK_62_MenuActive, // VK_NUMPAD2
kCharForVK_63_MenuActive, // VK_NUMPAD3
kCharForVK_64_MenuActive, // VK_NUMPAD4
kCharForVK_65_MenuActive, // VK_NUMPAD5
kCharForVK_66_MenuActive, // VK_NUMPAD6
kCharForVK_67_MenuActive, // VK_NUMPAD7
kCharForVK_68_MenuActive, // VK_NUMPAD8
kCharForVK_69_MenuActive, // VK_NUMPAD9
kCharForVK_6A, // VK_MULTIPLY
kCharForVK_6B, // VK_ADD
kNoCharGenKey, // VK_SEPARATOR
kCharForVK_6D, // VK_SUBTRACT
kCharForVK_6E, // VK_DECIMAL
kCharForVK_6F, // VK_DIVIDE
kNoCharGenKey, // VK_F1
kNoCharGenKey, // VK_F2
kNoCharGenKey, // VK_F3
kNoCharGenKey, // VK_F4
kNoCharGenKey, // VK_F5
kNoCharGenKey, // VK_F6
kNoCharGenKey, // VK_F7
kNoCharGenKey, // VK_F8
kNoCharGenKey, // VK_F9
kNoCharGenKey, // VK_F10
kNoCharGenKey, // VK_F11
kNoCharGenKey, // VK_F12
kNoCharGenKey, // VK_F13
kNoCharGenKey, // VK_F14
kNoCharGenKey, // VK_F15
kNoCharGenKey, // VK_F16
kNoCharGenKey, // VK_F17
kNoCharGenKey, // VK_F18
kNoCharGenKey, // VK_F19
kNoCharGenKey, // VK_F20
kNoCharGenKey, // VK_F21
kNoCharGenKey, // VK_F22
kNoCharGenKey, // VK_F23
kNoCharGenKey, // VK_F24
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey, // VK_NUMLOCK
kNoCharGenKey, // VK_SCROLL
kNoCharGenKey, // VK_OEM_FJ_JISHO, VK_OEM_NEC_EQUAL
kNoCharGenKey, // VK_OEM_FJ_MASSHOU
kNoCharGenKey, // VK_OEM_FJ_TOUROKU
kNoCharGenKey, // VK_OEM_FJ_LOYA
kNoCharGenKey, // VK_OEM_FJ_ROYA
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey, // VK_LSHIFT
kNoCharGenKey, // VK_RSHIFT
kNoCharGenKey, // VK_LCONTROL
kNoCharGenKey, // VK_RCONTROL
kNoCharGenKey, // VK_LMENU
kNoCharGenKey, // VK_RMENU
kNoCharGenKey, // VK_BROWSER_BACK
kNoCharGenKey, // VK_BROWSER_FORWARD
kNoCharGenKey, // VK_BROWSER_REFRESH
kNoCharGenKey, // VK_BROWSER_STOP
kNoCharGenKey, // VK_BROWSER_SEARCH
kNoCharGenKey, // VK_BROWSER_FAVORITES
kNoCharGenKey, // VK_BROWSER_HOME
kNoCharGenKey, // VK_VOLUME_MUTE
kNoCharGenKey, // VK_VOLUME_DOWN
kNoCharGenKey, // VK_VOLUME_UP
kNoCharGenKey, // VK_MEDIA_NEXT_TRACK
kNoCharGenKey, // VK_MEDIA_PREV_TRACK
kNoCharGenKey, // VK_MEDIA_STOP
kNoCharGenKey, // VK_MEDIA_PLAY_PAUSE
kNoCharGenKey, // VK_LAUNCH_MAIL
kNoCharGenKey, // VK_LAUNCH_MEDIA_SELECT
kNoCharGenKey, // VK_LAUNCH_APP1
kNoCharGenKey, // VK_LAUNCH_APP2
kNoCharGenKey,
kNoCharGenKey,
kCharForVK_BA, // VK_OEM_1
kCharForVK_BB, // VK_OEM_PLUS
kCharForVK_BC, // VK_OEM_COMMA
kCharForVK_BD, // VK_OEM_MINUS
kCharForVK_BE, // VK_OEM_PERIOD
kCharForVK_BF, // VK_OEM_2
kCharForVK_C0, // VK_OEM_3
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kCharForVK_DB, // VK_OEM_4
kCharForVK_DC, // VK_OEM_5
kCharForVK_DD, // VK_OEM_6
kCharForVK_DE, // VK_OEM_7
kNoCharGenKey, // VK_OEM_8
kNoCharGenKey,
kNoCharGenKey, // VK_OEM_AX
kCharForVK_E2, // VK_OEM_102
kNoCharGenKey, // VK_ICO_HELP
kNoCharGenKey, // VK_ICO_00
kNoCharGenKey, // VK_PROCESSKEY
kNoCharGenKey, // VK_ICO_CLEAR
kNoCharGenKey, // VK_PACKET
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey,
kNoCharGenKey, // VK_DBE_ALPHANUMERIC
kNoCharGenKey, // VK_DBE_KATAKANA
kNoCharGenKey, // VK_DBE_HIRAGANA
kNoCharGenKey, // VK_DBE_SBCSCHAR
kNoCharGenKey, // VK_DBE_DBCSCHAR
kNoCharGenKey, // VK_DBE_ROMAN
kNoCharGenKey, // VK_DBE_NOROMAN
kNoCharGenKey, // VK_DBE_ENTERWORDREGISTERMODE
kNoCharGenKey, // VK_DBE_ENTERIMECONFIGMODE
kNoCharGenKey, // VK_DBE_FLUSHSTRING
kNoCharGenKey, // VK_DBE_CODEINPUT
kNoCharGenKey, // VK_DBE_NOCODEINPUT
kNoCharGenKey, // VK_DBE_DETERMINESTRING
kNoCharGenKey, // VK_DBE_ENTERDLGCONVERSIONMODE
kNoCharGenKey,
kNoCharGenKey,
};
} // anonymous namespace
wchar_t JapaneseKeyboardLayoutEmulator::GetCharacterForKeyDown(
BYTE virtual_key,
const BYTE keyboard_state[256],
bool is_menu_active) {
if (virtual_key == VK_PACKET) {
return L'\0';
}
int index = 0;
const KeyboardStatus keystate(keyboard_state);
if (keystate.IsPressed(VK_SHIFT)) {
index |= kShiftPressed;
}
if (keystate.IsPressed(VK_CONTROL)) {
index |= kCtrlPressed;
}
if (keystate.IsPressed(VK_MENU)) {
index |= kAltPressed;
}
if (keystate.IsToggled(VK_CAPITAL)) {
index |= kCapsLock;
}
if (keystate.IsPressed(VK_KANA)) {
index |= kKanaLock;
}
// As far as we have observed with built-in Japanese keyboard layout on
// Windows Vista, we can ignore the following modifiers in terms of ToUnicode
// API.
// - VK_LWIN / VK_RWIN
// - VK_NUMLOCK
// - VK_SCROLL
// We can also assume there is no difference between left/right modifiers
// for built-in Japanese keyboard layout.
// - VK_LSHIFT/VK_RSHIFT
// - VK_LCONTROL/VK_RCONTROL
// - VK_LMENU/VK_RMENU
DCHECK(virtual_key < arraysize(kCharTable));
if (is_menu_active) {
DCHECK_LE(0, index);
DCHECK(index < arraysize(kNoCharGenKey));
return kCharTableMenuActive[virtual_key][index];
} else {
DCHECK_LE(0, index);
DCHECK(index < arraysize(kNoCharGenKey));
return kCharTable[virtual_key][index];
}
}
int JapaneseKeyboardLayoutEmulator::ToUnicode(
UINT virtual_key,
UINT scan_code,
CONST BYTE *key_state,
LPWSTR character_buffer,
int character_buffer_size,
UINT flags) {
const bool is_menu_active = ((flags & 0x1) == 0x1);
DCHECK_LE(virtual_key, 0xff);
const BYTE normalized_virtual_key = (virtual_key & 0xff);
// As far as we have observed with built-in Japanese keyboard layout on
// Windows Vista, ::ToUnicode returns a null character when VK_PACKET is
// specified.
// TODO(yukawa): Actually the returned value of VK_PACKET depends on
// |wScanCode|. More investigation needed.
if (normalized_virtual_key == VK_PACKET) {
if (character_buffer_size < 1) {
// If the buffer size is insufficient, ::ToUnicode returns 0.
return 0;
}
character_buffer[0] = L'\0';
return 1;
}
// The high-order bit of this value is set if the key is up.
// http://msdn.microsoft.com/en-us/library/ms646322.aspx
const bool is_key_down = ((scan_code & 0x8000) == 0);
// As far as we have observed with built-in Japanese keyboard layout on
// Windows Vista, there is no key to generate characters when the key is
// released.
if (!is_key_down) {
return 0;
}
const wchar_t character = GetCharacterForKeyDown(
normalized_virtual_key, key_state, is_menu_active);
// GetCharacterForKeyDown returns '\0' when no character is generated.
if (character == L'\0') {
return 0;
}
if (character_buffer_size < 1) {
// If the buffer size is insufficient, ::ToUnicode returns 0.
return 0;
}
character_buffer[0] = character;
return 1;
}
} // namespace win32
} // namespace mozc