在本章中,我将介绍窗口过程和基本的正文输出,并对一些较高级的题材,如键盘和鼠标,作一个简洁的介绍。消息系统完美的风格使得你可以相对完全地、及时地对这两个硬件设备进行控制。
  现在,你可以开始输入并运行程序清单 5.1 上的程序。

程序清单 5.1 KeyMouse 程序,用于追踪键盘和鼠标的输入
///// Program Name:KeyMouse.cpp// Programer: skyline// Description: Show how to trap keyboard and mouse input///

#define STRICT #define WIN32_LEAN_AND_MEAN

#include <windows.h>#include <windowsx.h>#include <string.h> #include <stdio.h>

#pragma warning (disable:4068)#pragma warning (disable:4100)

//-----------------------------// Interface//-----------------------------

// Some variabls

static int Xval=10;static int Yval=30;static char szAppName[]="KeyMouse";static HWND MainWindow;          

// Some procs

LRESULT CALLBACK WndProc(HWND hwnd,UINT Message,         WPARAM wParam,LPARAM lParam);BOOL Register(HINSTANCE hInst);HWND Create(HINSTANCE hInst,int nCmdShow);

#define skyline_DefProc DefWindowProc

void skyline_OnDestroy(HWND hwnd);void skyline_OnChar(HWND hwnd,UINT ch,int cRepeat);void skyline_OnKey(HWND hwnd,UINT vk,BOOL fDown,int cRepeat,UINT flags);void skyline_OnLButtonDown(HWND hwnd,BOOL fDoubleCick,int x,int y,UINT KeyFlags);void skyline_OnLButtonUp(HWND hwnd,int x,int y,UINT KeyFlags);void skyline_OnMouseMove(HWND hwnd,int x,int y,UINT KeyFlags);void skyline_OnPaint(HWND hwnd);void skyline_OnSysKey(HWND hwnd,UINT vk,BOOL fDown,int cRepeat,UINT flags);

//-----------------------// Initalization//-----------------------

///// Program entry point.///

#pragma argsused                                         

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInstance,       LPSTR lpszCmdParam,int nCmdShow){    MSG Msg;

if (! hPrevInstance)if (! Register(hInst)) return FALSE; 

    MainWindow = Create(hInst,nCmdShow);if(! MainWindow)return FALSE;

while(GetMessage(&Msg,NULL,0,0))    { TranslateMessage(&Msg); DispatchMessage(&Msg);                  }return Msg.wParam;}

// Register the window

BOOL Register(HINSTANCE hInst){    WNDCLASS WndClass;

    WndClass.style = CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;    WndClass.lpfnWndProc = WndProc;    WndClass.cbClsExtra = 0;    WndClass.cbWndExtra = 0;    WndClass.hInstance = hInst;    WndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);    WndClass.hCursor = LoadCursor(NULL,IDC_ARROW);    WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);    WndClass.lpszMenuName = NULL;    WndClass.lpszClassName = szAppName;

return RegisterClass(&WndClass);}

// Create the Window

HWND Create(HINSTANCE hInstance,int nCmdShow){    HWND hwnd = CreateWindowEx (0,szAppName,szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hInstance,NULL);if(hwnd == NULL)return hwnd;

    ShowWindow(hwnd,nCmdShow);    UpdateWindow(hwnd);

return hwnd;}

//----------------------------// WndProc and Implementation//----------------------------

//// The WindowProcedured//

LRESULT CALLBACK WndProc(HWND hwnd,UINT Message, WPARAM wParam,LPARAM lParam)  { switch(Message)    {   HANDLE_MSG(hwnd,WM_DESTROY,skyline_OnDestroy);   HANDLE_MSG(hwnd,WM_CHAR,skyline_OnChar);   HANDLE_MSG(hwnd,WM_KEYDOWN,skyline_OnKey);   HANDLE_MSG(hwnd,WM_KEYUP,skyline_OnKey);   HANDLE_MSG(hwnd,WM_MOUSEMOVE,skyline_OnMouseMove);  HANDLE_MSG(hwnd,WM_LBUTTONDBLCLK,skyline_OnLButtonDown);   HANDLE_MSG(hwnd,WM_LBUTTONDOWN,skyline_OnLButtonDown);   HANDLE_MSG(hwnd,WM_LBUTTONUP,skyline_OnLButtonUp);   HANDLE_MSG(hwnd,WM_PAINT,skyline_OnPaint);   HANDLE_MSG(hwnd,WM_SYSKEYUP,skyline_OnSysKey);   HANDLE_MSG(hwnd,WM_SYSKEYDOWN,skyline_OnSysKey);

default:return skyline_DefProc(hwnd,Message,wParam,lParam);    }}

///// Handle WM_DESTROY///

#pragma argsusedvoid skyline_OnDestroy(HWND hwnd){    PostQuitMessage(0);}

///// Handle regular keyboard hits// Use if you want to trap the letter keys or number keys.///

#pragma argsusedvoid skyline_OnChar(HWND hwnd,UINT ch,int cRepeat){char S[100];

    HDC DC = GetDC(hwnd);

    sprintf(S,"WM_CHAR ==> Char = %c  cRepeat = %d         ", ch,cRepeat);    TextOut(DC,Xval,Yval+20,S,strlen(S));

    ReleaseDC(hwnd,DC);}

///// Handle a key press// Don't try to process letter keys or number keys here.// Instead, ues WM_CHAR messages.///

#pragma argsusedvoid skyline_OnKey(HWND hwnd,UINT vk,BOOL fDown,int cRepeat,UINT flags){char S[100];

    HDC DC = GetDC(hwnd);

if(fDown)        sprintf(S,"WM_KEYDOWN ==> VK = %d  fDown = %d  cRepeat = %d  ""Flags = %d         ",vk,fDown,cRepeat,flags);else sprintf(S,"WM_KEYUP ==> VK = %d  fDown = %d  cRepeat = %d  ""Flags = %d         ",vk,fDown,cRepeat,flags);

    SetBkColor(DC,GetSysColor(COLOR_WINDOW));    TextOut(DC,Xval,Yval+40,S,strlen(S));

    ReleaseDC(hwnd,DC);}

///// This function is called when the left mouse button is// click or when the user double-clicks the mouse///

#pragma argsusedvoid skyline_OnLButtonDown(HWND hwnd,BOOL fDoubleClick,int x,int y,UINT KeyFlags){char S[100];

    HDC DC = GetDC(hwnd);

if(fDoubleClick)        sprintf(S,"WM_LBUTTONDBLCLK ==> DblClk = %d  X = %d  Y = %d  ""Flags = %d         ",fDoubleClick,x,y,KeyFlags);else sprintf(S,"WM_LBUTTONDOWN ==> Down = %d  X = %d  Y = %d  ""Flags = %d         ",fDoubleClick,x,y,KeyFlags);

    SetBkColor(DC,GetSysColor(COLOR_WINDOW));    TextOut(DC,Xval,Yval+100,S,strlen(S));

    ReleaseDC(hwnd,DC);}

///// This function is called when the mouse button is released///

#pragma argsusedvoid skyline_OnLButtonUp(HWND hwnd,int x,int y,UINT KeyFlags){char S[100];

    HDC DC = GetDC(hwnd);

    sprintf(S,"WM_LBUTTONUP ==> X = %d  Y = %d  ""Flag = %d         ",x,y,KeyFlags);

    SetBkColor(DC,GetSysColor(COLOR_WINDOW));    TextOut(DC,Xval,Yval+120,S,strlen(S));

    ReleaseDC(hwnd,DC);}

///// This function is called whenever the mouse moves///

#pragma argsusedvoid skyline_OnMouseMove(HWND hwnd,int x,int y,UINT KeyFlags){char S[100];

    HDC DC = GetDC(hwnd);

    sprintf(S,"WM_MOUSEMOVE ==> X = %d  Y = %d  ""KeyFlags = %d         ",x,y,KeyFlags);

if((KeyFlags & MK_CONTROL) == MK_CONTROL)  SetTextColor(DC,RGB(0,0,255));if((KeyFlags & MK_LBUTTON) == MK_LBUTTON)  SetTextColor(DC,RGB(0,128,0));if((KeyFlags & MK_RBUTTON) == MK_RBUTTON)  SetTextColor(DC,RGB(152,84,95));if((KeyFlags & MK_SHIFT) == MK_SHIFT)  SetTextColor(DC,RGB(196,0,196));

    SetBkColor(DC,GetSysColor(COLOR_WINDOW));    TextOut(DC,Xval,Yval+80,S,strlen(S));

    ReleaseDC(hwnd,DC);}

///// Handle WM_PAINT messages///

void skyline_OnPaint(HWND hwnd){    PAINTSTRUCT PaintStruct;    RECT Rect;

static char * Message[] =    {"WM_CHAR","WM_KEY","WM_SYSKEY","WM_MOUSEMOVE","WM_MOUSEDOWN","WM_MOUSEUP"    };

    HDC PaintDC = BeginPaint(hwnd,&PaintStruct);

    SetBkColor(PaintDC,GetSysColor(COLOR_WINDOW));    HFONT OldFont = SelectFont(PaintDC,  GetStockObject(OEM_FIXED_FONT));

    GetClientRect(hwnd,&Rect);    Rect.top = 5;    DrawText(PaintDC,"Mouse and Keyboard Demonstration",-1,  &Rect,DT_CENTER);    Rect.top = 20;    Rect.bottom = 40;    DrawText(PaintDC,"Try experimenting with mouse and keyboard.",-1,  &Rect,DT_CENTER);

    SelectFont(PaintDC,OldFont);

for(int i=0;i<6;i++)  TextOut(PaintDC,Xval,Yval+(20*(i+1)),  Message[i],strlen(Message[i]));

    EndPaint(hwnd,&PaintStruct);}

///// This function is called whenever the ALT key is pressed.///

#pragma argsusedvoid skyline_OnSysKey(HWND hwnd,UINT vk,BOOL fDown,int cRepeat,UINT flags){char S[100];

    HDC DC = GetDC(hwnd);    SetBkColor(DC,GetSysColor(COLOR_WINDOW));

if(fDown)    { sprintf(S,"WM_SYSKEYDOWN ==> VK = %d  fDown = %d  ""cRepeat = %d         ",vk,fDown,cRepeat,flags); TextOut(DC,Xval,Yval+60,S,strlen(S)); FORWARD_WM_SYSKEYUP(hwnd,vk,cRepeat,flags,skyline_DefProc);    }else    { sprintf(S,"WM_SYSKEYUP ==> VK = %d  fDown = %d  ""cRepeat = %d         ",vk,fDown,cRepeat,flags); TextOut(DC,Xval,Yval+60,S,strlen(S)); FORWARD_WM_SYSKEYUP(hwnd,vk,cRepeat,flags,skyline_DefProc);    }

    ReleaseDC(hwnd,DC);}

KeyMouse 程序提供两种主要的服务:  ·如何检测一个键被按下,并且显示按下键的键值以及一些相关的信息。  ·如何检测鼠标的移动或鼠标是否被按下,并在屏幕上显示出鼠标的当前位置及状态。  你可以花几分钟运行一下这个程序。当你移动鼠标或者按下键盘时,注意屏幕窗口上的反应。还要记住,每当你按下 Alt 键时,位于标题栏左上方的系统菜单就会被激活。此时若按一般的键都不会使屏幕恢复原样,除非再次按下 Alt 键或者采取其他动作改变焦点(focus)。有关检测 Alt 键按下动作的讨论在论述 WM_SYSKEY 消息一节中进行。

  附注:  在 Windows 程序设计中,焦点的概念是很重要的。只有被聚焦的窗口才会响应键盘和鼠标的输入,而没有被聚焦的窗口是不响应的。你经常可以知道哪一个特定程序处于焦点,只要检查一下它的标题栏是否为高亮度显示就可以了。

  同样十分重要的是要理解一个时刻只有一个窗口处于聚焦状态。例如,如果你打开 File 菜单,那么这个新打开的菜单处于焦点位置,而程序的主窗口就处于非活动状态。同样,在 My Computer 窗口中,当从 View 菜单中弹出 Options 对话框时,这个对话框是焦点,而 My Computer 窗口的其它部分是不活动的。

报告鼠标和键盘事件的一个程序(转)相关推荐

  1. python获取键盘事件_50-用Python监听鼠标和键盘事件

    PyHook是一个基于Python的"钩子"库,主要用于监听当前电脑上鼠标和键盘的事件.这个库依赖于另一个Python库PyWin32,如同名字所显示的,PyWin32只能运行在W ...

  2. python鼠标监听_用Python监听鼠标和键盘事件

    PyHook是一个基于Python的"钩子"库,主要用于监听当前电脑上鼠标和键盘的事件.这个库依赖于另一个Python库PyWin32,如同名字所显示的,PyWin32只能运行在W ...

  3. 【Qt】QT鼠标和键盘事件

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 鼠标事件 04. 键盘事件 05. 附录 01. 概述 事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者 ...

  4. python监听鼠标事件_Python中使用PyHook监听鼠标和键盘事件实例

    Python 中使用 PyHook 监听鼠标和键盘事件实例 PyHook 是一个基于 Python 的"钩子"库,主要用于监 听当前电脑上鼠标和键盘的事件.这个库依赖于另一个 Py ...

  5. Android 使用 sendevent 模拟鼠标和键盘事件

    Android 使用 sendevent 模拟鼠标和键盘事件 模拟原理是对驱动发送消息,就是linux里面的input子系统. 命令格式: sendevent /dev/input/eventX [t ...

  6. HTML5 Canvas鼠标与键盘事件

    演示HTML5 Canvas鼠标事件,获取Canvas对象上的鼠标坐标,演示键盘事件 通过键盘控制Canvas上对象移动. Canvas对象支持所有的JavaScript的鼠标事件,包括鼠标点击(Mo ...

  7. 简单的鼠标和键盘事件+阻止默认阻止冒泡+dom0,dom2

    什么是事件 在我们学习DOM之后,事件就是我们必不可少的一块知识点了,事件其实就是我们的一些操作需要在用户来完成之后才执行的.比如我们PC端的点击事件,键盘事件,以及我们移动端的的触屏事件.接下来咱们 ...

  8. html5鼠标事件监听,HTML5 Canvas鼠标与键盘事件

    演示HTML5 Canvas鼠标事件,获取Canvas对象上的鼠标坐标,演示键盘事件 通过键盘控制Canvas上对象移动. Canvas对象支持所有的JavaScript的鼠标事件,包括鼠标点击(Mo ...

  9. HTML将canvas画布鼠标事件,HTML5 Canvas鼠标与键盘事件demo示例

    演示html5 canvas鼠标事件,获取canvas对象上的鼠标坐标,演示键盘事件通过键盘控制canvas上对象移动. canvas对象支持所有的javascript的鼠标事件,包括鼠标点击(mou ...

最新文章

  1. 敏捷个人2012.8月份线下活动报道:Toastmasters、团队管理
  2. Style Report中报表组件的使用场景简析
  3. 为你详细解读HTTP请求头(header)的具体含意
  4. 推荐一款好用的redis客户端工具
  5. linux 安装反病毒软件
  6. python函数和模块有什么特性_python-函数包和模块
  7. java在frame怎么计时_java – 退出jframe时的Swing stop计时器
  8. C++多线程快速入门(三):生产者消费者模型与条件变量使用
  9. 第二十一期:老大难的GC原理及调优,这全说清楚了
  10. WPS2016专业版
  11. Flash CS3:FLV视频短片我来做!
  12. mro python_Python进阶-继承中的MRO与super
  13. Ubuntu配置拼音和五笔输入法
  14. 公众号微信认证(企业类型的订阅号)参考步骤
  15. QObject::moveToThread:
  16. 弹球游戏过关之缩短挡板(三)
  17. 四川大学江安校区计算机学院照片,几张图告诉你四川大学江安校区颜值到底有多高...
  18. 华为智慧屏s系列和v系列有什么区别?
  19. 快递物流查询,分析物流走向信息
  20. Git安装失败 报The drive or UNC share you

热门文章

  1. return2libc学习笔记
  2. tomcat配置访问项目时不需要加项目名称
  3. PHP curl 实现RESTful PUT DELETE 实例
  4. 【小知识】为什么负数除二和右移一位的结果不一样?
  5. 学习笔记------tag文件
  6. 商业智能项目错误经验总结(三) 需求调研
  7. Windows Mobile下访问Sqlite的Native C++封装
  8. 了解Android Matrix转换
  9. 前端路由(一) 路由,hash,history
  10. SpringBoot学习(一)