编写程序: 设计一个窗口, 当单击鼠标左键时, 窗口中显示"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. thinkphp5的mkdir() Permission denied问题

    最近一直在用tp5写项目,在此遇到的问题也比较多.今天来谈谈“mkdir() Permission denied”错误. 你如果不仅仅写代码,还得部署到线上,那么这个tp5的这个错误,你有很大概率会遇 ...

  3. Zookeeper之Curator(1)客户端基本的创建,删除,更新,查找操作api

    Curator Framework提供了简化使用zookeeper更高级的API接口.它包涵很多优秀的特性,主要包括以下三点: 自动连接管理:自动处理zookeeper的连接和重试存在一些潜在的问题: ...

  4. webpack快速入门——插件配置:HTML文件的发布

    1.把dist中的index.html复制到src目录中,并去掉我们引入的js 2.在webpack.config.js中引入 const htmlPlugin = require('html-web ...

  5. mybatis 关联表查询

    这段时间由于项目上的需求:需要将数据库中两表关联的数据查询出来展示到前端(包含一对一,一对多): (1)一对一: 在实体类中维护了另一个类的对象: 这里我以用户(User)和产品(Product)为例 ...

  6. 【xsy1097】 拼图 构造题

    题目大意:请你使用n个图形拼成一个矩形.要求:①这每个图形都由1×1的小正方形组成,而且第i个图形由i个小正方形组成.②除了第1个和第2个图形以外,任意一个图形的所有小正方形,不都在一条直线上. 数据 ...

  7. 服务器集群的session管理

    应用服务器的高可用架构设计主要基于服务无状态这一特性,但是事实上,业务总是有状态的,单机情况下,Session可由部署在服务器上的web容器(如Jboss)管理.在使用负载均衡的集群环境中,由于负载均 ...

  8. 剑指offer五十四之字符流中第一个不重复的字符

    一.题目 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...

  9. Vue路由router-link的使用

    Vue路由router-link的使用 相关Html: <!DOCTYPE html> <html lang="en"> <head> < ...

  10. 【C#小知识】C#中一些易混淆概念总结(八)---------解析接口 分类: C# 2014-02-18 00:09 2336人阅读 评论(4) 收藏

     这一篇主要来解析关于面向对象中最总要的一个概念--接口. 对于接口来说,C#是有规定使用Interface关键字来声明接口.它的声明是和类一致的.可以说接口就是一个特殊的抽象类.如下代码: cl ...