打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
键盘消息之二:《Windows程序设计》读书笔记之六 扩展键标志
击键消息中lParam消息参数的含义:
缺图
重复计数(Repeat Count 015

       重复计数是该消息所表示的击键次数。大多数情况下,重复计数设置为1。如果在一个击键消息处理前有多次按下该键,则增加重复计数。WM_KEYUPWM_SYSKEYUP消息的重复计数总为1

OEM
扫描码(Scan Code1623

       表示由硬件(键盘)产生的代码。
       扩展键标志(Extended Key Flag 24

       如果击键结果来自IBM增强键盘的附加键之一,那么扩展键标志为1。现在我们使用的键盘一般都是属于IBM增强键盘。对于键盘右端的AltCtrl键,以及非数字键盘上的光标移动键(包括InsertDelete键)、数字键盘上的斜杠(/)、EnterNum Lock键,该标志均置1

       环境代码(Context Code29

       环境代码在按下Alt键后为1。对于WM_SYSKEYDOWNWM_SYSKEYUP消息,这一位总是1;对于WM_KEYUPWM_KEYDOWN消息,这一位总是0

l
如果活动窗口最小化,那么它将没有输入焦点。这时所有击键都产生WM_SYSKEYDOWNWM_SYSKEYUP消息。如果Alt键未被按下,环境代码则为0

l
一些国家键盘,有些字符通过ShiftCtrlAlt键与其他键产生。此时环境代码为1,但此消息并非系统击键消息。

键的先前状态(Previous Key State30

       如果在此之前键是释放的,键的先前状态为0,否则为1。对于WM_KEYUPWM_SYSKEYUP消息,它总是为1;对于WM_KEYDOWNWM_SYSKEYDOWN消息,可以是0,也可以是1

转换状态(Transition State31

键被按下时该位为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;

}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
孙鑫VC视频教程笔记之第一课“Windows程序的内部运行原理”
windows程序设计(5)使用滚动条
MFC 播放MP3
什么?C语言也可以抢红包,速度来围观。
http://book.51cto.com/art/200801/63840.htm
Windows程序设计——GDI字符及图形标准输出标准输出
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服