编写程序: 设计一个窗口, 当单击鼠标左键时, 窗口中显示"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. JavaWeb 基础面试

    1. 启动项目时如何实现不在链接里输入项目名就能启动?  修改Tomcat配置文件 server.xml.找到自己的项目配置 : <Context docBase="oneProjec ...

  2. node 利用http和cheerio编写简易爬虫

    首先cnpm init创建一个package.json 引入cheerio模块 cnpm install --save cheerio 然后开始编写代码 let cheerio = require(' ...

  3. 【JXOI2018】排序问题 贪心

    我们令$sum_i$表示数字i在加完数字的数列中出现的次数,那么答案显然为$\dfrac{(n+m)!}{\sum_{i=0}^{\infty}sum_i!}$ 不难发现,当每次添加的数为$[l,r] ...

  4. Java8-Guava实战示例

      示例一: 跟示例三对比一下,尽量用示例三 List<InvoiceQueryBean> invoiceQueryBeanList = new ArrayList<>(); ...

  5. Servlet基础知识点

    一.web.xml 的加载顺序是: ServletContext-> context-param ->listener -> filter -> servlet,而同个类型之间 ...

  6. git使用时的一下简单命令

    一.简介 SVN集中式版本控制系统 分布式版本控制系统 二.使用git 1.git init 将这个命令变成git可管理的仓库 2.git add filename 将这个文件添加到仓库 3.git ...

  7. 【C#】override,Abstract,Virtual 介绍及区别--转载

    要扩展或修改继承的方法.属性.索引器或事件的抽象实现或虚实现,必须使用 override 修饰符. 1. override 方法提供从基类继承的成员的新实现.通过 override 声明重写的方法称为 ...

  8. mongodb 错误 SCRAM-SHA-1 authentication failed for --转

    log 日志错误信息 2018-10-24T16:14:42.244+0800 I NETWORK [initandlisten] connection accepted from 192.168.1 ...

  9. 07-python链接mysql

    python3 中使用的是 PyMySQL模块, 取代了之前的 MysqlDB 模块, 其实使用都是一样的, 如果没有该模块的, 需要使用pip命令进行安装 pip install PyMySQL 安 ...

  10. mongodb 数据库备份脚本

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