Để phân biệt giữa các phiên bản bên trái và bên phải của phím Shift, Ctrl hoặc Alt, bạn phải sử dụng chức năng MapVirtualKey()
hoặc bit 'khóa mở rộng' trong lParam được truyền bằng thông điệp của khóa ảo. Các chức năng sau đây sẽ thực hiện dịch đó cho bạn - chỉ cần vượt qua trong mã phím ảo và lParam từ tin nhắn, và bạn sẽ lấy lại trái/phải mã phím ảo cụ thể cho phù hợp:
WPARAM MapLeftRightKeys(WPARAM vk, LPARAM lParam)
{
WPARAM new_vk = vk;
UINT scancode = (lParam & 0x00ff0000) >> 16;
int extended = (lParam & 0x01000000) != 0;
switch (vk) {
case VK_SHIFT:
new_vk = MapVirtualKey(scancode, MAPVK_VSC_TO_VK_EX);
break;
case VK_CONTROL:
new_vk = extended ? VK_RCONTROL : VK_LCONTROL;
break;
case VK_MENU:
new_vk = extended ? VK_RMENU : VK_LMENU;
break;
default:
// not a key we map from generic to left/right specialized
// just return it.
new_vk = vk;
break;
}
return new_vk;
}
Nếu mã phím ảo được truyền vào không phải là bản đồ được chuyển sang phiên bản bên trái/phải, mã khóa ban đầu được truyền lại không thay đổi. Vì vậy, bạn chỉ có thể chạy thông số WM_KEYDOWN
/WM_KEYUP
/WM_SYSKEYDOWN
/WM_SYSKEYUP
thông qua hàm bất cứ khi nào bạn cần phân biệt giữa các biến thể bên trái và bên phải.
Bằng cách sử dụng MapVirtualKey()
bạn không cần phải biết truyền thuyết về các thay đổi bên trái và dịch chuyển phải là 0x2a và 0x36 - API sẽ quản lý chi tiết đó. Và nếu chúng từng xảy ra khác nhau (không phải điều đó sẽ thực sự xảy ra), Windows sẽ chịu trách nhiệm đối phó với nó, không phải bạn.
Vì vậy, trong WM_KEYDOWN
/WM_KEYUP
/WM_SYSKEYDOWN
/WM_SYSKEYUP
bạn xử lý bạn chỉ cần thêm một dòng mã mà trông giống như:
wparam = MapLeftRightKeys(wparam, lparam);
và phần còn lại của mã của bạn có thể hoạt động trên trái/phải cụ thể Mã VK như thể thông báo hệ thống chỉ cung cấp cho bạn ngay từ đầu.
Nguồn
2013-04-12 17:40:56
Đã lâu rồi, nhưng theo như tôi nhớ, các hệ thống cũ không phân biệt được giữa các lần bấm phím shift trái hoặc phải. – DragonZero
Chỉ 'GetKeyState()' và 'GetAsyncKeyState()' sẽ phân biệt giữa các phím bấm trái và phải (từ WinUser.h). –