计算机组成原理课程设计报告_第1页
计算机组成原理课程设计报告_第2页
计算机组成原理课程设计报告_第3页
计算机组成原理课程设计报告_第4页
计算机组成原理课程设计报告_第5页
已阅读5页,还剩7页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目 录目 录 .1一 设计目的 .2二 设计内容 .2三 设计要求 .2四 设计过程 .21、窗口函数程序实现的步骤 .22、消息循环 .43、编写窗口过程函数 .54、自启动模块设计 .65、定时发送邮件模块设计 .66、程序流程图 .8五 设计总结 .9参考文献 .9一 设计目的通过本次课程设计,设计一个键盘监听程序,系统启动后自动记录所有键盘信息的功能,能够记录键盘的输入值,且该程序具有自动启动功能,并能够定期通过网络给某人的指定的邮箱发送所记录的信息。二 设计内容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((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( /虚拟键消息转换为字符消息DispatchMessage( /消息回传给操作系统GetMessage 函数只有在接收到 WMQUIT 消息时,才返回 0。此时 while语句的判断条件为假,循环退出,程序才能结束运行。在没有接收到 WMQUIT消息时,Windows 应用程序就通过 while 循环来保证程序始终处于运行状态。Windows 应用程序的消息处理机制如下图所示: 2GetMesage3DispatchMesage14图 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_USERSoftwareMicrosoftWindows NTCurrentVersionWindows 然后在 Windows 键值下新建一个字符串键值,并更名为 load,双击打开这个字符串键值,接着把弹出窗口的“数值数据”中设置要随系统自动运行的程序的路径即可。需要注意的是,输入的路径文件名是短文件名。(2)另一种方法同样是在注册表中进行设置,找到键值:HKEY_LOCAL_MACHINESOFTWAREMicrosoftCommand Processor,找到并双击“AutoRun”这项,然后将键值设置为需要启动的程序即可。这两种方法都可以.在实验中,运用了方法一,通过“SoftwareMicrosoftWindowsCurrentVersionRun“;找到键值,再通过hkResult,“hacker“/ 注册表键名 */,0,REG_EXPAND_SZ,(unsigned char *)“F:KBDLoggerDebugKBDLogger.exe“,32 找到路径后,将可执行程序写入注册表,实现自启动.5、定时发送邮件模块设计(1)邮件发送功能通过 Simple MAPI 的函数以及相关的数据结构,根据其结构可以很简单的实现发送邮件的功能。实现一个完整的邮件发送过程,只需要一个函数“MAPISendMail()”, MAPI 与邮件系统关系密切,要能够使用 MAPI 的功能,系统必须安装有支持 MAPI 的邮件系统,比如 Outlook、Outlook Express、Eudora、Netscape 等.在本次设计中,邮件系统使用的是 outlook,经过测试,发现没有问题。首先是 MAPI 库的初始化,包括两个步骤:装载 MAPI 库、得到函数入口地址。发送邮件 MAPISendMail(),发送邮件功能就是对 MAPISendMail()的封装。下面解释这个 API 函数的参数定义。ULONG FAR PASCAL MAPISendMail(LHANDLE lhSession, ULONG ulUIParam, lpMapiMessage lpMessage, FLAGS flFlags, ULONG ulReserved);lhSession、ulUIParam 和 ulReserved 这三个参数,简单地设置为 0 就可以了。flFlags 有三个有效位,分别是 MAPI_DIALOG,MAPI_LOGON_UI,MAPI_NEW_SESSION。重点是 lpMessage 这个参数,它指向一个 MapiMessage 类型的结构,详细地定义了一个邮件的全部信息。(2)结构 MapiMessage使用时首先定义一个 MapiMessage 类型的变量,将其清零。现在我们只要简单地设定 lpszSubject(标题) 、lpszNoteText(正文) 、lpOriginator(发件人) 、nRecipCount(收件人计数, ) ,lpRecips(一个包含全部收件人的数组),nFileCount(附件计数) 、lpFiles(包含每个附件信息的数组) 。nRecipCount 和 nFileCount 的值一定要与实际的收件人和附件数目相符。(3)结构 MapiRecipDesc必须设置 ulRecipClass、lpszName、lpszAddress(4)结构 MapiFileDesc必须设置的有 lpszPathName、nPosiotion 两个参数(5)定时功能定时功能通过调用系统函数 SetTimer()来实现。其声明原型如下UINT_PTR SetTimer(HWND hWnd, / handle to windowUINT_PTR nIDEvent, / timer identifierUINT uElapse, / time-out valueTIMERPROC lpTimerFunc / timer procedure);此程序中的时间值设置的是 20 秒,也就是说每隔 20 秒,程序会向指定的邮箱发送键盘记录。6、程序流程图(1)键盘监控流程图图 6-1 键盘监控流程图五 设计总结通过这次的键盘监听程序的设计,使得我对窗口中响应键盘消息的机制更加深入的了解了,通过对窗口的属性设置、注册窗口类、创建窗口、显示窗口、更新窗口、消息循环、窗口过程函数的编写,具体深入的体会了窗口响应键盘消息的实现过程和方法。同时,对于 Windows 的许多函数有了进一步运用与了解,如运用 MAPI 发送邮件的使用规则、运用 CreateWindow()进行窗口的创建、窗口过程函数的编写、GetForegroundWindow 的使用等等,提高了编程的能力。关于程序运行时,无法实现邮件发送的问题,经过反复的调试,都无法发现问题。把发送邮件的程序提取出来单独运行时,发现是没有问题的,能够正确的发送邮件。但是,把这个程序完整的放入到整个程序中后,却无法发送邮件。最后发现是由于进程的互斥问题。记录的文件一直处于打开状态,并且不断地有记录向文件中写入,这时想要访问该文件当然是不被允许的。究其原因,还是由于设计程序是没有考虑操作系统的问题,文件打开后没有立刻关闭。在今后的程序设计中,要考虑关于操作系统的同步互斥问题。这种问题的出现,也正好提醒我要把学过的每一门专业课都学扎实,切实提高自己的编程功力,这样,才能够做到真正的提高。试验中遇到了不少的问题,有些通过上网查阅资料解决了,还有些通过与同学的交流,发现并解决了问题.尽管过程有些漫长,但是,在这个逐步解决问题的过程中,无论是自学能力,查阅资料的能力还是实际的动手能力都有了较大的提高.我想,只有通过不断的诸如此类的课程设计,才能够更好的检验我们平时所学的知识。参考文献1计算机网络安全教程石志国 薛为民 江俐 编著 清华大学出版社 北京交通大学出版社 2004 年2计算机网络安全基础袁津生 吴砚农 编 人民邮电出版社 2002 年3网站: 附录1、窗口函数的实现源代码:INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow)/主函数HWND hWnd;MSG msg;WNDCLASS wndClass;wndClass.style = CS_HREDRAW | CS_VREDRAW;wndClass.lpfnWndProc = WndProc;wndClass.cbClsExtra = 0;wndClass.cbWndExtra = 0;wndClass.hInstance = hInstance;wndClass.hIcon = LoadIcon(NULL, IDI_AP

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论