如何解决Windows键盘消息和Alt键
我试图了解消息循环和键盘消息在 Windows 系统中如何工作。我编写了一个具有消息循环的简单程序:
// include the basic windows header file
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
// the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
char MsgBuff[300];
template <typename T>
char* BinVal(T SrcVal) {
const short BitsCount = sizeof(T) * CHAR_BIT;
const short SeparatorCount = sizeof(T) * 2 - 1;
static char BinValStr[BitsCount + SeparatorCount] = { 0 };
printf("BitsCount: %d\n",BitsCount);
printf("SeparatorCount: %d\n",SeparatorCount);
printf("BinValStr size: %d\n",BitsCount + SeparatorCount);
int i = 0;
int j = 0;
for (i = BitsCount + SeparatorCount - 1; i >= 0; i--) {
if ((j + 1) % 5 == 0) {
BinValStr[i] = ' ';
}
else {
if ((SrcVal & 1) == 1)
BinValStr[i] = '1';
else
BinValStr[i] = '0';
SrcVal >>= 1;
}
j++;
//printf(": %d,%d\n",i,SrcVal&1);
}
return BinValStr;
}
// the entry point for any Windows program
int WINAPI WinMain(
_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPSTR lpCmdLine,_In_ int nCmdShow) {
// the handle for the window,filled by a function
HWND hWnd;
// this struct holds information for the window class
WNDCLASSEX wc;
// clear out the window class for use
ZeroMemory(&wc,sizeof(WNDCLASSEX));
// fill in the struct with the needed information
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.lpszClassName = L"WindowClass1";
// register the window class
RegisterClassEx(&wc);
// create the window and use the result as the handle
hWnd = CreateWindowEx(NULL,L"WindowClass1",// name of the window class
L"Our First Windowed Program",// title of the window
WS_OVERLAPPEDWINDOW,// window style
300,// x-position of the window
300,// y-position of the window
500,// width of the window
400,// height of the window
NULL,// we have no parent window,NULL
NULL,// we aren't using menus,NULL
hInstance,// application handle
NULL); // used with multiple windows,NULL
// display the window on the screen
ShowWindow(hWnd,nCmdShow);
// enter the main loop:
// this struct holds Windows event messages
MSG msg;
// Enter the infinite message loop
while (TRUE) {
// Check to see if any messages are waiting in the queue
while (PeekMessage(&msg,NULL,PM_REMOVE))
{
// translate keystroke messages into the right format
TranslateMessage(&msg);
// send the message to the WindowProc function
DispatchMessage(&msg);
}
// If the message is WM_QUIT,exit the while loop
if (msg.message == WM_QUIT)
break;
}
// return this part of the WM_QUIT message to Windows
return msg.wParam;
}
int LoopCnt = 0;
int BinMask = 0b00000000'00000000'00000000'11111111;
// this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd,LPARAM lParam) {
switch (message) {
case WM_DESTROY: {
PostQuitMessage(0);
} break;
case WM_KEYDOWN: {
sprintf_s(MsgBuff,300,"WM_KEYDOWN(#%i) wParam (virtual-key code): %d (%Xh),scan code: %X,lParam(bin): %s\n",LoopCnt,wParam,lParam & BinMask,BinVal(lParam));
OutputDebugStringA(MsgBuff);
} break;
case WM_CHAR: {
sprintf_s(MsgBuff,"WM_CHAR(#%i) wParam (virtual-key code): %d (%Xh),BinVal(lParam));
OutputDebugStringA(MsgBuff);
} break;
default:
return DefWindowProc(hWnd,message,lParam);
}
LoopCnt++;
}
我在那里检查了{em>扫描代码发送的WM_KEYDOWN
消息lParam
参数。
现在我有以下问题:
- 为什么在按
left Alt
时按WM_KEYDOWN
键不会生成right Alt
消息? (当按左Alt键时,调试器不会进入WM_KEYDOWN:
case语句) - 为什么按下
right Alt
键会同时生成两条WM_KEYDOWN
消息-分别具有1D(hex)和38(hex)扫描代码?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。