击键消息中lParam消息参数的含义:
缺图
重复计数(Repeat Count) 0-15
重复计数是该消息所表示的击键次数。大多数情况下,重复计数设置为1。如果在一个击键消息处理前有多次按下该键,则增加重复计数。WM_KEYUP或WM_SYSKEYUP消息的重复计数总为1。
OEM扫描码(Scan Code)16-23
表示由硬件(键盘)产生的代码。
扩展键标志(Extended Key Flag) 24
如果击键结果来自IBM增强键盘的附加键之一,那么扩展键标志为1。现在我们使用的键盘一般都是属于IBM增强键盘。对于键盘右端的Alt和Ctrl键,以及非数字键盘上的光标移动键(包括Insert和Delete键)、数字键盘上的斜杠(/)、Enter、Num Lock键,该标志均置1。
环境代码(Context Code)29
环境代码在按下Alt键后为1。对于WM_SYSKEYDOWN和WM_SYSKEYUP消息,这一位总是1;对于WM_KEYUP和WM_KEYDOWN消息,这一位总是0。
l
如果活动窗口最小化,那么它将没有输入焦点。这时所有击键都产生WM_SYSKEYDOWN和WM_SYSKEYUP消息。如果Alt键未被按下,环境代码则为0。
l
一些国家键盘,有些字符通过Shift、Ctrl或Alt键与其他键产生。此时环境代码为1,但此消息并非系统击键消息。
键的先前状态(Previous Key State)30
如果在此之前键是释放的,键的先前状态为0,否则为1。对于WM_KEYUP或WM_SYSKEYUP消息,它总是为1;对于WM_KEYDOWN或WM_SYSKEYDOWN消息,可以是0,也可以是1。
转换状态(Transition State)31
键被按下时该位为0;键被释放时为1。
GetKeyState函数并非实时检查键盘状态,它只是检查当前正在处理的消息发生之前和发生之时的键盘状态,它是通过读取消息队列中该键的按键消息来实现的。
GetAsyncKeyState函数通过实时检查键盘硬件状态返回结果。
//实现在窗口中显示按键信息
#include <windows.h>
#include <stdio.h>
//全局变量
//USEFORM("Unit2.cpp", Form2);
//---------------------------------------------------------------------------
RECT rc; //记录滚屏的矩形区域
int xChar, yChar; //文本输入点坐标
WNDCLASSEX wnd; //窗口类结构变量
wchar_t szAppName[] = L"键盘消息监视程序"; //窗口类名
//函数声名
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
BOOL MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE hInstance,int iCmdShow);
//函数:WinMain
//作用:入口函数
//int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int)
int WINAPI wWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,LPTSTR szCmdLine, int iCmdShow)
{
MSG msg;
if(!MyRegisterClass(hInstance))
{
return FALSE;
}
if(!InitInstance(hInstance,iCmdShow))
{
return FALSE;
}
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}
//函数:ShowKey
//作用:实现在窗口中显示按键信息
void ShowKey (HWND hwnd, int iType, wchar_t *szMessage,WPARAM wParam, LPARAM lParam)
{
static wchar_t *szFormat[2] = { L"%-14s %3d %c %6u %4d %5S %5S %6S %6S",
L"%-14s %3d %c %6u %4d %5S %5S %6S %6S" } ;
wchar_t szBuffer[180];
HDC hdc;
ScrollWindowEx(hwnd, 0, -yChar, &rc, &rc,NULL,NULL,SW_INVALIDATE);
hdc = GetDC (hwnd);
SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT));
wsprintfW (szBuffer, szFormat [iType],
szMessage, //消息
wParam,//虚拟键代码
(BYTE) (iType ? wParam :wParam ),//显示字符值
LOWORD (lParam),//重复次数
HIWORD (lParam) & 0xFF,//OEM键盘扫描码
//判断是否为增强键盘的扩展键
(PWSTR) (0x01000000 & lParam ? "是" : "否"),
//判断是否同时使用了ALT键
(PWSTR) (0x20000000 & lParam ? "是" : "否"),
(PWSTR) (0x40000000 & lParam ? "按下" : "抬起"),//判断前一次击键状态
(PWSTR) (0x80000000 & lParam ? "按下" : "抬起"));//判断转换状态
TextOut (hdc, xChar, rc.bottom - yChar, szBuffer, lstrlenW(szBuffer));
ReleaseDC (hwnd, hdc);
ValidateRect (hwnd, NULL);
}
//函数:WndProc
//作用:处理主窗口的消息
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
static wchar_t szTop[] =
L"消息 键 字符 重复数 扫描码 扩展码 ALT 前一状态 转换状态";
static wchar_t szUnd[] =
L"_______ __ ____ _____ ______ ______ ___ _______ ______";
//在窗口中输出文字作为信息标题
HDC hdc;
PAINTSTRUCT ps;
TEXTMETRIC tm;
switch (iMsg)
{
case WM_CREATE://处理窗口创建的消息
hdc = GetDC (hwnd);
//设定字体
SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT));
//检取当前字体的度量数据
GetTextMetrics (hdc, &tm);
xChar = tm.tmAveCharWidth;//保存字体平均宽度
yChar = tm.tmHeight;//保存字体高度
ReleaseDC (hwnd, hdc);
rc.top = 3 * yChar / 2;
return 0;
case WM_SIZE://处理窗口大小改变的消息
//窗体改变后保存新的滚屏区域右下角坐标
rc.right = LOWORD (lParam);
rc.bottom = HIWORD (lParam);
UpdateWindow (hwnd);
return 0;
case WM_PAINT://处理窗口重绘消息
InvalidateRect (hwnd, NULL, TRUE);
hdc = BeginPaint (hwnd, &ps);
SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
SetBkMode (hdc, TRANSPARENT) ;
TextOut (hdc, xChar, yChar / 2, &szTop[0], lstrlenW( szTop) - 1) ;
TextOut (hdc, xChar, yChar / 2+5, &szUnd[0], lstrlenW( szUnd) - 1) ;
EndPaint (hwnd, &ps);
return 0;
case WM_KEYDOWN://处理键盘上某一键按下的消息
ShowKey (hwnd, 0, L"WM_KEYDOWN", wParam, lParam);
return 0;
case WM_KEYUP://处理键盘上某一按下键被释放的消息
ShowKey (hwnd, 0, L"WM_KEYUP", wParam, lParam);
return 0;
case WM_CHAR://处理击键过程中产生的非系统键的可见字符消息
ShowKey (hwnd, 1, L"WM_CHAR", wParam, lParam);
return 0;
case WM_DEADCHAR://处理击键过程中产生的非系统键"死字符"消息
ShowKey (hwnd, 1, L"WM_DEADCHAR", wParam, lParam);
return 0;
case WM_SYSKEYDOWN://处理系统键按下的消息
ShowKey (hwnd, 0, L"WM_SYSKEYDOWN", wParam, lParam);
break;
case WM_SYSKEYUP://处理系统键抬起的消息
ShowKey (hwnd, 0, L"WM_SYSKEYUP", wParam, lParam);
break;
case WM_SYSCHAR://处理系统键可见字符消息
ShowKey (hwnd, 1, L"WM_SYSCHAR", wParam, lParam);
break;
case WM_SYSDEADCHAR://处理系统键"死字符"消息
ShowKey (hwnd, 1, L"WM_SYSDEADCHAR", wParam, lParam);
break;
case WM_DESTROY://处理结束应用程序的消息
PostQuitMessage (0);
return 0;
}
return DefWindowProc (hwnd, iMsg, wParam, lParam);
}
//函数:MyRegisterClass
//作用:注册窗口类
BOOL MyRegisterClass(HINSTANCE hInstance)
{
wnd.cbSize= sizeof (wnd);
wnd.style = CS_HREDRAW | CS_VREDRAW;
wnd.lpfnWndProc = WndProc;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
wnd.hInstance = hInstance;
wnd.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wnd.hCursor = LoadCursor (NULL, IDC_ARROW);
wnd.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wnd.lpszMenuName = NULL;
wnd.lpszClassName = &szAppName[0];
wnd.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
return RegisterClassEx (&wnd);
}
//函数:InitInstance
//作用:创建主窗口
BOOL InitInstance(HINSTANCE hInstance,int iCmdShow)
{
HWND hwnd;
hwnd = CreateWindow (szAppName,
L"键盘消息监视程序",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL
);
if(!hwnd)
{
return FALSE;
}
ShowWindow (hwnd, iCmdShow);
UpdateWindow (hwnd);
return TRUE;
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。