编写程序: 设计一个窗口, 当单击鼠标左键时, 窗口中显示"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. java实现简单扫雷游戏

    /** * 一个简单的扫雷游戏 MainFram.java */ package www.waston; import java.awt.BorderLayout; import java.awt.C ...

  2. docker镜像基本操作一

    获取镜像 首先说明一下如何从Docker hub中获取高质量的镜像,从Docker镜像库获取镜像的命令是docker pull .其命令格式为: docker pull [选项] [Docker Re ...

  3. [underscore源码学习]——`>>` 运算符和二分查找

    这是一篇记录学习 underscore v0.0.5 的fragment,觉得有点意思,和大家分享一下. 先看_.sortedIndex的源码,它用来确定 obj 在 array中的位置(array升 ...

  4. 智能卡操作系统COS概述

    随着IC卡从简单的同步卡发展到异步卡,从简单的EPROM卡发展到内带微处理器的智能卡(又称CPU卡),对IC卡的各种要求越来越高.而卡本身所需要的各种管理工作也越来越复杂,因此就迫切地需要有一种工具来 ...

  5. 更换SSL证书

    1.申请证书,需要提供完整域名(例如:xxx.aaa.com),会和证书完全匹配. 2.将证书上传到web服务器,例如我的nginx,在server中指定证书路径. 3.重启web服务器.(这个证书和 ...

  6. Jmeter修改自身启动IP

    先说一下问题,控制机访问压力机都是可以的,但是压力机访问控制机就不行了报:2019/04/13 16:05:49 ERROR - jmeter.samplers.RemoteTestListenerW ...

  7. 数据库中"DDL","DML","DCL"

    sql组成:DDL:数据库模式定义语言,关键字:createDML:数据操纵语言,关键字:Insert.delete.updateDCL:数据库控制语言 ,关键字:grant.removeDQL:数据 ...

  8. MySQL介绍及安装(一)

    一.关系型数据库和非关系型数据库 1.1:关系型数据库 关系型数据库是把复杂的数据结构归结为简单的二元关系(即二维表格的形式),在关系型数据库中,对数据的操作几乎全部建立在一个或多个关系表格上的,通过 ...

  9. OpenGL-非实时渲染与实时混合使用(有图有真相)

    视频教程请关注 http://edu.csdn.net/lecturer/lecturer_detail?lecturer_id=440 一个朋友在问(我也曾经遇到过这样的事情),尤其是在地理信息上面 ...

  10. 如何写一个拼写检查器-by Peter Norvig

    本文原著:Peter Norvig  中文翻译:徐宥 上个星期, 我的两个朋友 Dean 和 Bill 分别告诉我说他们对 Google 的快速高质量的拼写检查工具感到惊奇. 比如说在搜索的时候键入 ...