编写程序: 设计一个窗口, 当单击鼠标左键时, 窗口中显示"LEFT BUTTON"; 当单击鼠标右键时, 窗口中显示"RIGHT BUTTON"; 当单击向上箭头键时, 窗口中显示"UP Key"; 当单击Ctrl键时, 窗口中显示"CTRL Key"; 当单击 Ctrl+A 键时, 窗口中显示"CTRL+A Key":

程序主要代码如下:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

    int wmId, wmEvent;

    PAINTSTRUCT ps;

    HDC hDC;

    //TCHAR szHello[MAX_LOADSTRING];

    //LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);

    static char cLEFT[]="LEFT BUTTON";

    static char cRIGHT[]="RIGHT BUTTON";

    static char cUp[]="UP key";

    static char cCTRL[]="CTRL key";

    static char cCTRLA[]="CTRL+A key";

    static BOOL nUpKeyDown=FALSE, nCtrlKeyDown=FALSE, nCtrlAKeyDown=FALSE,nLeftDown=FALSE,nRightDown=FALSE;

    int xOrg,yOrg;

    switch (message)

    {

        case WM_KEYDOWN:

        {

            switch(wParam)

            {

            case VK_UP:

                nUpKeyDown=TRUE;

                break;

            case VK_CONTROL:

                nCtrlKeyDown=TRUE;

                break;

            

            default:

                break;

            }

        }

            break;

 

        case WM_KEYUP:

            InvalidateRect(hWnd,NULL,TRUE);    //刷新用户区。

            break;

        case WM_CHAR:

            {

                    if(wParam==(65&VK_CONTROL))    

                    {

                        if(nCtrlKeyDown == TRUE)

                        {

                            nCtrlAKeyDown = TRUE;

                            nCtrlKeyDown = FALSE;

                        }

                    }

                    

                }

                break;

        case WM_LBUTTONDOWN:

            nLeftDown=TRUE;

            InvalidateRect(hWnd,NULL,TRUE);    //刷新用户区。

            break;

        case WM_RBUTTONDOWN:

            nRightDown=TRUE;

            InvalidateRect(hWnd,NULL,TRUE);    //刷新用户区。

            break;

 

        case WM_COMMAND:

            wmId = LOWORD(wParam);

            wmEvent = HIWORD(wParam);

            // Parse the menu selections:

            switch (wmId)

            {

                case IDM_ABOUT:

                 DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);

                 break;

                case IDM_EXIT:

                 DestroyWindow(hWnd);

                 break;

                default:

                 return DefWindowProc(hWnd, message, wParam, lParam);

            }

            break;

        case WM_PAINT:

            hDC = BeginPaint(hWnd, &ps);

            // TODO: Add any drawing code here...

            RECT rt;

            GetClientRect(hWnd, &rt);

            xOrg=(rt.left+rt.right)/2;

            yOrg=(rt.top +rt.bottom)/2;

            if(nUpKeyDown == TRUE)

            {

                TextOut(hDC,xOrg,yOrg,cUp,strlen(cUp));

                nUpKeyDown = FALSE;

(续前表)

}

            else if(nCtrlAKeyDown == TRUE)

            {

                TextOut(hDC,xOrg,yOrg,cCTRLA,strlen(cCTRLA));

                nCtrlAKeyDown = FALSE;

                nCtrlKeyDown = FALSE;

            }

            else if(nCtrlKeyDown == TRUE&&nCtrlAKeyDown == FALSE)

            {

                TextOut(hDC,xOrg,yOrg,cCTRL,strlen(cCTRL));

                nCtrlKeyDown = FALSE;

            }

            else if(nLeftDown == TRUE)

            {

                TextOut(hDC,xOrg,yOrg,cLEFT,strlen(cLEFT));

                nLeftDown = FALSE;

            }

            else if(nRightDown == TRUE)

            {

                TextOut(hDC,xOrg,yOrg,cRIGHT,strlen(cRIGHT));

                nRightDown = FALSE;

            }

    
 

            //DrawText(hdc, lpString, _tcsclen(lpString), &rt, DT_CENTER);

            EndPaint(hWnd, &ps);

            break;

        case WM_DESTROY:

            PostQuitMessage(0);

            break;

        default:

            return DefWindowProc(hWnd, message, wParam, lParam);

}

return 0;

}

 

编译并调试程序

程序运行结果运行结果如下图:

单击鼠标左键

单击鼠标右键

单击向上箭头

单击Ctrl键

单击Ctrl+A

刚开始刷新客户区时使用

InvalidateRect(hWnd,NULL,FALSE);

结果导致背景客户区背景不更新,输出的文本重叠,了解了InvalidateRect()的使用方式后,将语句改为

InvalidateRect(hWnd,NULL,TRUE);

即成功解决了问题;

Windows应用程序对键盘与鼠标的响应的更多相关文章

  1. 第六章 Windows应用程序对键盘与鼠标的响应 P121 6-8

    基于键盘与鼠标应用的程序设计 一.实验目的 1.掌握键盘与鼠标在应用程序中的消息响应机制.   二.实验内容及步骤 实验任务 1.熟悉键盘的消息响应: 2.熟悉鼠标的消息响应: 实验内容 设计一个窗口 ...

  2. 第六章 Windows应用程序对键盘与鼠标的响应

  3. WPF嵌入Unity3D之后,unity3D程序的键盘和鼠标事件无法触发(3D程序的焦点无法激活)的解决方案

    目前最通用的客户端调用3D的方式,就是WPF程序通过Process启动Unity3D的exe进程,直接上代码: //开启3D进程 internal void Create3DProcess(strin ...

  4. vc程序设计--对键盘与鼠标的响应(1)

    // WindowsProject2.cpp : 定义应用程序的入口点. // /** * 当按下CTRL键时输出信息:CTRL键被压下 * 当按下K键时输出信息:K键被压下 * 当按下CTRL+K键 ...

  5. 利用钩子函数来捕捉键盘响应的windows应用程序

    一:引言: 你也许一直对金山词霸的屏幕抓词的实现原理感到困惑,你也许希望将你的键盘,鼠标的活动适时的记录下来,甚至你想知道木马在windows操作系统是怎样进行木马dll的加载的…..其实这些都是用到 ...

  6. windows 编程 —— 消息与参数(滚动条、键盘、鼠标)

    目录: 滚动条 键盘 鼠标 滚动条ScrollBar 发送消息:WM_VSCROLL和WM_HSCROLL 参数wParam:wParam消息参数被分为一个低字组和一个高字组.wParam的低字组是一 ...

  7. DirectX11 With Windows SDK--05 键盘和鼠标输入

    前言 提供键鼠输入可以说是一个游戏的必备要素.在这里,我们不使用DirectInput,而是使用Windows的消息处理机制,不过要从头开始实现会让事情变得很复杂.DXTK提供了鼠标输入的Mouse. ...

  8. 将CodedUI Test 放到控制台程序中,模拟鼠标键盘操作

    CodedUI Test是微软的自动化测试工具,在VS中非常好用.可以用来模拟鼠标点击,键盘输入.但执行的时候必须要用mstest调用,无法传入参数(当然可以写入config文件中,但每次修改十分麻烦 ...

  9. PhiloGL学习(3)——程序员的法宝—键盘、鼠标

    前言 上一篇文章中介绍了如何让对象动起来,本文介绍如何让场景响应我们的鼠标和键盘以控制场景的缩放及对象的转动和移动等. 一. 原理分析 有了上一篇文章的基础,我们已经知道了如何让场景和对象动起来.本文 ...

随机推荐

  1. (转)为什么要重写 hashcode 和 equals 方法?

    作者丨hsm_computer cnblogs.com/JavaArchitect/p/10474448.html 我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候 ...

  2. robot framework 测试/预发/线上环境快捷切换

    通常情况下布署的三套环境:测试.预发及线上环境.调试或者辅助验证测试时,切环境改变量甚是麻烦.这些变量包括但不限于:一些url信息,数据库信息,预置用户信息等. 切换环境方法一:使用变量文件,通过判断 ...

  3. cassandra用户名和密码的设置

    设置Cassandra使用用户名和密码验证的步骤如下: 1.修改${CASSANDRA_HOME}/conf/cassandra.yaml,把authenticator: AllowAllAuthen ...

  4. [JavaScript] 判断设备类型,加载相应css

    $(document).ready(function () { var browser = { versions: function () { var u = navigator.userAgent, ...

  5. python实战——网络爬虫

    学习网络爬虫的目的: 1,可以私人定制一个搜索引擎,可以深层次的了解搜索引擎的工作原理. 2,大数据时代,要进行数据分析,首先要有数据源,学习爬虫,可以让我们获取更多的数据. 3,从业人员可以可好的利 ...

  6. AQS源码泛读,梳理设计流程(jdk8)

    一.AQS介绍 AQS(AbstractQueuedSynchronizer)抽象队列同步器,属于多线程编程的基本工具:JDK对其定义得很详细,并提供了多种常用的工具类(重入锁,读写锁,信号量,Cyc ...

  7. python3异常处理 try

    一. 简介 在编程过程中为了增加友好性,在程序出现Bug时一般不会直接将错误信息展示给用户,而是提供一个友好的输出提示. 二. 使用 1.异常基础 常用结构: try: pass except Exc ...

  8. Luogu P4670 [BalticOI 2011 Day2]Plagiarism 题解

    我最近是不是数据结构学傻了啊... 这道题看是1e5,所以复杂度为\(O(nlogn)\)的是完全可以跑过去的,然后看题,要求的对于每个数满足要求的区间的长度之和,我们自然而然的就可以想到用FHQ-T ...

  9. mongodb 数据库备份脚本

    写了小shell bash, 用于给mongodb数据进行备份 #!/bin/bash #backup MongoDB #文件目录 #backup MongoDB #!/bin/bash #backu ...

  10. kendo UI 入门

    Kendo UI 是一套前端开发宽假,意为日本的“剑道” 首先到官方网站下载最新的30天试用版,地址为:http://www.telerik.com/download/kendo-ui 需要简单注册一 ...