《windows核心编程》(十一)-----------2013.8.13
一、概念
键盘消息
•消息的使用
1 KEYDOWN可以重复出现,KEYUP只能在按键松开时出现1次
2 TranslateMessage在转换WM_KEYDOWN消息时,对于可见字符可以产生WM_CHAR,不可见字符无此消息。
3 WM_KEYDOWN/UP的wParam是表示的按键虚拟键码,WM_CHAR是表示输入的字符ASC码。
在窗口绘制“Hello”字符串,使用上下左右光标键控制其移动:
// WinCreate.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "WinKey.h"
#include "windows.h"
#include "stdio.h"
HINSTANCE g_hInstance = 0;//用于接受应用程序实例句柄
HANDLE g_hOutput = 0;
int g_xPos = 0;
int g_yPos = 0;
void OnKeyDown(HWND hWnd,WPARAM wParam)
{
CHAR szText[256] = {0};
sprintf(szText,"WM_KEYDOWN:%08X\n",wParam);
WriteConsole(g_hOutput,szText,strlen(szText),NULL,NULL);
switch (wParam)
{
case VK_UP:
g_yPos --;
InvalidateRect(hWnd,NULL,TRUE);
break;
case VK_DOWN:
g_yPos ++;
InvalidateRect(hWnd,NULL,TRUE);
break;
case VK_LEFT:
g_xPos --;
InvalidateRect(hWnd,NULL,TRUE);
break;
case VK_RIGHT:
g_xPos ++;
InvalidateRect(hWnd,NULL,TRUE);
break;
}
}
void OnKeyUp(HWND hWnd,WPARAM wParam)
{
CHAR szText[256] = {0};
sprintf(szText,"WM_KEYUP:%08X\n",wParam);
WriteConsole(g_hOutput,szText,strlen(szText),NULL,NULL);
}
void OnPaint(HWND hWnd)
{
PAINTSTRUCT ps = {0};
HDC hdc = BeginPaint(hWnd,&ps);
TextOut(hdc,g_xPos,g_yPos,"Hello",strlen("Hello"));
EndPaint(hWnd,&ps);
}
//窗口处理函数
LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,
WPARAM wParam,LPARAM lParam)
{
switch(nMsg)
{
case WM_PAINT:
OnPaint(hWnd);
case WM_KEYDOWN:
OnKeyDown(hWnd,wParam);
break;
case WM_KEYUP:
OnKeyUp(hWnd,wParam);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd,nMsg,wParam,lParam);
}
//注册窗口类
BOOL Register(LPSTR lpClassName,WNDPROC wndproc)
{
WNDCLASSEX wce = {0};
wce.cbSize = sizeof(wce);
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wce.hCursor = NULL;
wce.hIcon = NULL;
wce.hIconSm = NULL;
wce.hInstance = g_hInstance;
wce.lpfnWndProc = wndproc;
wce.lpszClassName = lpClassName;
wce.lpszMenuName = NULL;
wce.style = CS_HREDRAW | CS_VREDRAW;
ATOM nAtom = RegisterClassEx(&wce);
if(nAtom == 0)
{
return FALSE;
}
return TRUE;
}
//创建主窗口
HWND CreateMain(LPSTR lpClassName,LPSTR lpWndName)
{
HWND hWnd = CreateWindowEx(0,lpClassName,lpWndName,
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,g_hInstance,NULL);
return hWnd;
}
//显示窗口
void Display(HWND hWnd)
{
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
}
//消息循环
void Message()
{
MSG nMsg = {0};
while (GetMessage(&nMsg,NULL,0,0))
{
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);
}
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
AllocConsole();
g_hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
g_hInstance = hInstance;
Register("Main",WndProc);
HWND hWnd = CreateMain("Main","Window");
Display(hWnd);
Message();
return 0;
}
当GetMessage函数抓到WM_CHAR消息,将消息交给TranslateMessage函数进行处理,让其翻译出是大写字母还是小写字母。
获取WM_CHAR消息中的wParam参数的数值,然后输出其数值:
// WinCreate.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "WinKey.h"
#include "windows.h"
#include "stdio.h"
HINSTANCE g_hInstance = 0;//用于接受应用程序实例句柄
HANDLE g_hOutput = 0;
int g_xPos = 0;
int g_yPos = 0;
void OnKeyDown(HWND hWnd,WPARAM wParam)
{
CHAR szText[256] = {0};
sprintf(szText,"WM_KEYDOWN:%08X\n",wParam);
WriteConsole(g_hOutput,szText,strlen(szText),NULL,NULL);
switch (wParam)
{
break;
case VK_UP:
g_yPos --;
InvalidateRect(hWnd,NULL,TRUE);
break;
case VK_DOWN:
g_yPos ++;
InvalidateRect(hWnd,NULL,TRUE);
break;
case VK_LEFT:
g_xPos --;
InvalidateRect(hWnd,NULL,TRUE);
break;
case VK_RIGHT:
g_xPos ++;
InvalidateRect(hWnd,NULL,TRUE);
break;
}
}
void OnKeyUp(HWND hWnd,WPARAM wParam)
{
CHAR szText[256] = {0};
sprintf(szText,"WM_KEYUP:%08X\n",wParam);
WriteConsole(g_hOutput,szText,strlen(szText),NULL,NULL);
}
void OnPaint(HWND hWnd)
{
PAINTSTRUCT ps = {0};
HDC hdc = BeginPaint(hWnd,&ps);
TextOut(hdc,g_xPos,g_yPos,"Hello",strlen("Hello"));
EndPaint(hWnd,&ps);
}
void OnChar(HWND hWnd,WPARAM wParam)
{
CHAR szText[256] = {0};
sprintf(szText,"WM_CHAR:%08X\n",wParam);
WriteConsole(g_hOutput,szText,strlen(szText),NULL,NULL);
}
//窗口处理函数
LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,
WPARAM wParam,LPARAM lParam)
{
switch(nMsg)
{
case WM_CHAR:
OnChar(hWnd,wParam);
case WM_PAINT:
OnPaint(hWnd);
case WM_KEYDOWN:
OnKeyDown(hWnd,wParam);
break;
case WM_KEYUP:
OnKeyUp(hWnd,wParam);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd,nMsg,wParam,lParam);
}
//注册窗口类
BOOL Register(LPSTR lpClassName,WNDPROC wndproc)
{
WNDCLASSEX wce = {0};
wce.cbSize = sizeof(wce);
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wce.hCursor = NULL;
wce.hIcon = NULL;
wce.hIconSm = NULL;
wce.hInstance = g_hInstance;
wce.lpfnWndProc = wndproc;
wce.lpszClassName = lpClassName;
wce.lpszMenuName = NULL;
wce.style = CS_HREDRAW | CS_VREDRAW;
ATOM nAtom = RegisterClassEx(&wce);
if(nAtom == 0)
{
return FALSE;
}
return TRUE;
}
//创建主窗口
HWND CreateMain(LPSTR lpClassName,LPSTR lpWndName)
{
HWND hWnd = CreateWindowEx(0,lpClassName,lpWndName,
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,g_hInstance,NULL);
return hWnd;
}
//显示窗口
void Display(HWND hWnd)
{
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
}
//消息循环
void Message()
{
MSG nMsg = {0};
while (GetMessage(&nMsg,NULL,0,0))
{
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);
}
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
AllocConsole();
g_hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
g_hInstance = hInstance;
Register("Main",WndProc);
HWND hWnd = CreateMain("Main","Window");
Display(hWnd);
Message();
return 0;
}
鼠标消息
•鼠标消息
1基本鼠标消息
WM_LBUTTONDOWN-鼠标左键按下
WM_LBUTTONUP-鼠标左键抬起
WM_RBUTTONDOWN-鼠标右键按下
WM_RBUTTONUP-鼠标右键抬起
WM_MOUSEMOVE-鼠标移动消息
2双击消息
WM_LBUTTONDBLCLK-鼠标左键双击
WM_RBUTTONDBLCLK-鼠标右键双击
3滚轮消息
WM_MOUSEWHEEL-鼠标滚轮消息
•基本鼠标消息
消息参数
WPARAM- 其他按键的状态,例如Ctrl/Shift等
LPARAM- 鼠标的位置,窗口客户区坐标系。
LOWORD X坐标位置
HIWORD Y坐标位置
鼠标消息使用
一般情况鼠标按下/抬起成对出现。在鼠标移动过程中,会根据移动速度产生一系列的WM_MOUSEMOVE消息。
获取左键单击消息:
// WinCreate.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
#include "WinMouse.h"
HINSTANCE g_hInstance = 0;//用于接受应用程序实例句柄
HANDLE g_hOutput = 0;
//窗口处理函数
void OnLButtonDown(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
CHAR szText[256] = {0};
sprintf(szText,"WM_LBUTTONDOWN:按键状态 = %08X, X = %d, Y = %d\n",wParam,LOWORD(lParam),HIWORD(lParam));
WriteConsole(g_hOutput,szText,strlen(szText),NULL,NULL);
}
void OnLButtonUp(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
CHAR szText[256] = {0};
sprintf(szText,"WM_LBUTTONUP:按键状态 = %08X, X = %d, Y = %d\n",wParam,LOWORD(lParam),HIWORD(lParam));
WriteConsole(g_hOutput,szText,strlen(szText),NULL,NULL);
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,
WPARAM wParam,LPARAM lParam)
{
switch(nMsg)
{
case WM_LBUTTONDOWN:
OnLButtonDown(hWnd,wParam,lParam);
break;
case WM_LBUTTONUP:
OnLButtonUp(hWnd,wParam,lParam);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd,nMsg,wParam,lParam);
}
//注册窗口类
BOOL Register(LPSTR lpClassName,WNDPROC wndproc)
{
WNDCLASSEX wce = {0};
wce.cbSize = sizeof(wce);
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wce.hCursor = NULL;
wce.hIcon = NULL;
wce.hIconSm = NULL;
wce.hInstance = g_hInstance;
wce.lpfnWndProc = wndproc;
wce.lpszClassName = lpClassName;
wce.lpszMenuName = NULL;
wce.style = CS_HREDRAW | CS_VREDRAW;
ATOM nAtom = RegisterClassEx(&wce);
if(nAtom == 0)
{
return FALSE;
}
return TRUE;
}
//创建主窗口
HWND CreateMain(LPSTR lpClassName,LPSTR lpWndName)
{
HWND hWnd = CreateWindowEx(0,lpClassName,lpWndName,
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,g_hInstance,NULL);
return hWnd;
}
//显示窗口
void Display(HWND hWnd)
{
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
}
//消息循环
void Message()
{
MSG nMsg = {0};
while (GetMessage(&nMsg,NULL,0,0))
{
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);
}
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
AllocConsole();
g_hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
g_hInstance = hInstance;
Register("Main",WndProc);
HWND hWnd = CreateMain("Main","Window");
Display(hWnd);
Message();
return 0;
}
获取WM_MOUSEMOVE鼠标移动消息:
// WinCreate.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
#include "WinMouse.h"
HINSTANCE g_hInstance = 0;//用于接受应用程序实例句柄
HANDLE g_hOutput = 0;
//窗口处理函数
void OnLButtonDown(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
CHAR szText[256] = {0};
sprintf(szText,"WM_LBUTTONDOWN:按键状态 = %08X, X = %d, Y = %d\n",wParam,LOWORD(lParam),HIWORD(lParam));
WriteConsole(g_hOutput,szText,strlen(szText),NULL,NULL);
}
void OnLButtonUp(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
CHAR szText[256] = {0};
sprintf(szText,"WM_LBUTTONUP:按键状态 = %08X, X = %d, Y = %d\n",wParam,LOWORD(lParam),HIWORD(lParam));
WriteConsole(g_hOutput,szText,strlen(szText),NULL,NULL);
}
void OnMouseMove(HWND hWnd,LPARAM lParam)
{
CHAR szText[256] = {0};
sprintf(szText,"WM_MOUSEMOVE: X = %d, Y = %d\n",LOWORD(lParam),HIWORD(lParam));
WriteConsole(g_hOutput,szText,strlen(szText),NULL,NULL);
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,
WPARAM wParam,LPARAM lParam)
{
switch(nMsg)
{
case WM_LBUTTONDOWN:
OnLButtonDown(hWnd,wParam,lParam);
break;
case WM_LBUTTONUP:
OnLButtonUp(hWnd,wParam,lParam);
break;
case WM_MOUSEMOVE:
OnMouseMove(hWnd,lParam);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd,nMsg,wParam,lParam);
}
//注册窗口类
BOOL Register(LPSTR lpClassName,WNDPROC wndproc)
{
WNDCLASSEX wce = {0};
wce.cbSize = sizeof(wce);
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wce.hCursor = NULL;
wce.hIcon = NULL;
wce.hIconSm = NULL;
wce.hInstance = g_hInstance;
wce.lpfnWndProc = wndproc;
wce.lpszClassName = lpClassName;
wce.lpszMenuName = NULL;
wce.style = CS_HREDRAW | CS_VREDRAW;
ATOM nAtom = RegisterClassEx(&wce);
if(nAtom == 0)
{
return FALSE;
}
return TRUE;
}
//创建主窗口
HWND CreateMain(LPSTR lpClassName,LPSTR lpWndName)
{
HWND hWnd = CreateWindowEx(0,lpClassName,lpWndName,
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,g_hInstance,NULL);
return hWnd;
}
//显示窗口
void Display(HWND hWnd)
{
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
}
//消息循环
void Message()
{
MSG nMsg = {0};
while (GetMessage(&nMsg,NULL,0,0))
{
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);
}
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
AllocConsole();
g_hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
g_hInstance = hInstance;
Register("Main",WndProc);
HWND hWnd = CreateMain("Main","Window");
Display(hWnd);
Message();
return 0;
}