编写程序: 设计一个窗口, 当单击鼠标左键时, 窗口中显示"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应用程序对键盘与鼠标的响应的更多相关文章
-
第六章 Windows应用程序对键盘与鼠标的响应 P121 6-8
基于键盘与鼠标应用的程序设计 一.实验目的 1.掌握键盘与鼠标在应用程序中的消息响应机制. 二.实验内容及步骤 实验任务 1.熟悉键盘的消息响应: 2.熟悉鼠标的消息响应: 实验内容 设计一个窗口 ...
- 第六章 Windows应用程序对键盘与鼠标的响应
-
WPF嵌入Unity3D之后,unity3D程序的键盘和鼠标事件无法触发(3D程序的焦点无法激活)的解决方案
目前最通用的客户端调用3D的方式,就是WPF程序通过Process启动Unity3D的exe进程,直接上代码: //开启3D进程 internal void Create3DProcess(strin ...
-
vc程序设计--对键盘与鼠标的响应(1)
// WindowsProject2.cpp : 定义应用程序的入口点. // /** * 当按下CTRL键时输出信息:CTRL键被压下 * 当按下K键时输出信息:K键被压下 * 当按下CTRL+K键 ...
-
利用钩子函数来捕捉键盘响应的windows应用程序
一:引言: 你也许一直对金山词霸的屏幕抓词的实现原理感到困惑,你也许希望将你的键盘,鼠标的活动适时的记录下来,甚至你想知道木马在windows操作系统是怎样进行木马dll的加载的…..其实这些都是用到 ...
-
windows 编程 —— 消息与参数(滚动条、键盘、鼠标)
目录: 滚动条 键盘 鼠标 滚动条ScrollBar 发送消息:WM_VSCROLL和WM_HSCROLL 参数wParam:wParam消息参数被分为一个低字组和一个高字组.wParam的低字组是一 ...
-
DirectX11 With Windows SDK--05 键盘和鼠标输入
前言 提供键鼠输入可以说是一个游戏的必备要素.在这里,我们不使用DirectInput,而是使用Windows的消息处理机制,不过要从头开始实现会让事情变得很复杂.DXTK提供了鼠标输入的Mouse. ...
-
将CodedUI Test 放到控制台程序中,模拟鼠标键盘操作
CodedUI Test是微软的自动化测试工具,在VS中非常好用.可以用来模拟鼠标点击,键盘输入.但执行的时候必须要用mstest调用,无法传入参数(当然可以写入config文件中,但每次修改十分麻烦 ...
-
PhiloGL学习(3)——程序员的法宝—键盘、鼠标
前言 上一篇文章中介绍了如何让对象动起来,本文介绍如何让场景响应我们的鼠标和键盘以控制场景的缩放及对象的转动和移动等. 一. 原理分析 有了上一篇文章的基础,我们已经知道了如何让场景和对象动起来.本文 ...
随机推荐
-
SpringMVC学习系列(5) 之 数据绑定-2
在系列(4)中我们介绍了如何用@RequestParam来绑定数据,下面我们来看一下其它几个数据绑定注解的使用方法. 1.@PathVariable 用来绑定URL模板变量值,这个我们已经在系列(3) ...
-
LeetCode OJ--Swap Nodes in Pairs
https://oj.leetcode.com/problems/swap-nodes-in-pairs/ 链表的处理 /** * Definition for singly-linked list. ...
-
Android 判断wifi和4G网络是否开启
public boolean isWifiAvailable() { ConnectivityManager connectivityManager = (ConnectivityManager) g ...
-
js导出成excel
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
-
JavaScript数组对象方法
数组的方法:首先,数组的方法有数组原型方法,也有从object对象继承来的方法.这里只详细说明一下数组的原型方法. (1)join:把数组中的所有元素放入一个字符串.元素通过指定的分隔符进行分隔. 例 ...
-
php opcode缓存
本文移至:http://www.phpgay.com/Article/detail/classid/2/id/61.html 1.什么是opcode 解释器分析代码之后,生成可以直接运行的中间代码,就 ...
-
监听Google Player下载并获取包名等信息
一.解决思路 通过监听ContentObserver监听下载路径content://downloads 二.具体步骤 1 设置监听器 context.getContentResolver() .reg ...
-
Kettle变量和自己定义java代码的实例应用
1 kettle.properties參数配置数据源连接和FTP连接 因为測试环境和生产环境中数据库连接FTP等配置会在部署过程中变更,所以预先定义成配置项,在配置文件里改动.这样測试和公布将会变得 ...
-
BZOJ 3958 Mummy Madness
Problem BZOJ Solution 算法:二分+扫描线 快要2019年了,就瞎写一篇博客来凑数,不然感觉太荒凉了-- 答案是可二分的,那么二分的依据是什么呢?不妨设当前二分的答案为\(mid\ ...
-
隔行换色(WPF DataGrid 标准例子)
<DataGrid AlternationCount="2"> <DataGrid.RowStyle> ...