老师在问下:如果黑莓key2按键灯key3可能是1也可能是0黑莓key2按键灯key1一样能启动led1,在这种状态下程序怎么写。

计算机室如何管理自身所存放着嘚大量的信息的呢windows的磁盘管理程序为我们提供了一套严密而又高效的信息组织形式--硬盘上的信息是以文件的形式被管理的。

什么是文件计算机中,一篇文章、一幅图片、一个程序等都是以文件的形式存储在磁盘上的每个文件都有一个文件名。计算机就是对文件按名存取的文件名的格式如下:主文件名.扩展名。

通常程序中的数据在程序运行结束之后,就会从内存中清除再次运行程序时不会自动出現。在编制程序的过程中不可避免的会遇到将某些数据永久保存的问题当程序关闭后,依然可以使用这些数据这时就需要进行文件操莋。

Visual C++处理的文件通常分为两种:

文本文件:只可被任意文本编辑器读取ASCII文本

指对包含任意格式或无格式数据的文件的统称。

这里只介绍攵本文件的读写INI文件也属于文本文件的范畴,且INI文件的结构和用途与普通的文本文件不同所以会单独介绍。

认识CFile类;认识文本文件;能够正确灵活应用文本文件存取信息;避免文本文件读写的常见误区

CFile是MFC的文件操作基本类,它直接支持无缓冲的二进制磁盘I/O操作并通過其派生类支持文本文件、内存文件和socket文件。

客户操作记录实例功能预览及关键知识点

许多系统出于安全或其他原因,常常要求随时对鍵盘进行监控利用Hook(钩子)技术编写的应用程序能够很好地达到这个目的。本软件就制作了一个客户操作记录软件即在软件运行过程Φ,用户在键盘上的黑莓key2按键灯操作会被记录下来这样对维护软件的正常运行非常有利。

只要启动客户操作记录软件后不管输入焦点昰否在本软件上,黑莓key2按键灯都会被记录下来我们需要的是键盘的系统监控,只要本软件在运行无论当前计算机在做什么,都能监测箌用户黑莓key2按键灯的行为并做出反应这就要用到Hook技术。

Hook技术在很多特殊软件中广泛应用如,金山词霸的“取词”功能就用到了Hook计技術。

钩子的本质是一段用以处理系统消息的程序通过系统调用,将其挂入系统钩子的种类很多,每种钩子可以截获并处理相应的消息每当特定的消息发出,在到达目的窗口之前钩子程序先行截获该消息、得到对此消息的控制权。此时在钩子函数中就可以对截获的消息进行加工处理甚至可以强制结束消息的传递。

从钩子的本质来看可以优先截获操作系统的各种消息进行处理,所以它几乎无所不能因为windows的应用程序都是基于消息驱动的,应用程序的操作都依赖于它所得到的消息的类型及内容

如果Hook过程在应用程序中实现,若应用程序不是当前窗口时该Hook就补齐作用;如果Hook在DLL中实现,程序在运行中动态调用它它能实时对系统进行监控。根据需要我们采用的是在DLL中實现Hook的方式。

(应用程序exe? 和DLL的区别所在)

字符被计算机处理时都是以二进制代码的形式出现的即一个字符对应一个8位二进制数,这种二進制码的集合就是所谓的ASCII码

基本的ASCII码有128个,最高位都是0对应的十进制数是0-127。键盘上的字符如英文字母、数字和一些常用符号,使用基本ASCII部分如数字“0”的ASCII码用二进制数表示就是(即十进制数48)。

扩展的ASCII码有128个最高位是1,对应的十进制数是128-255一些制表符和其他符号使用扩展的ASCII码部分。

为解决汉字的存储和显示问题我国制定了国际GB2312。据此规定一个汉字由2个扩展的ASCII码组成,这种高位为1的双字节汉字編码就是汉字的机内码简称为内码。例如汉字“学”的机内码用二进制数表示就是00111(即十进制数206 和167 ),用十进制表示就是53671(206*256+167)对于芓符,文本文件存储的是它的ASCII码对于汉字,文本文件存储的是它的内码即两位ASCII码,如字符串“0学0”在文本文件中存储的内容是11

正确嘚文本文件读写过程

1.定义文件变量;2.打开指定的文件;3.向从文本文件中写入信息;4.从文本文件中读取信息;5.关闭文件

定义文件变量格式:CStdioFile 攵件变量;

例如,定义一个名称为f1的文件变量语句如下:CStdioFile f1;

可以直接通过CStdioFile的构造函数来打开磁盘文件,同时可以用标志位指定打开方式(呮读、只写、读写等):

其中lpszFileName表示要打开的文件名,可以是相对路径或绝对路径

nOpenFlags设置文件打开方式标志位可以指定用“|”连接多个标誌位。下面是常用的打开标志:

CFile::modeCreate:如果指定文件名的文件不存在则新建文件;如果文件存在并且没有设置CFile::modeNoTruncate标志,则清空文件

CFile::modeNoTruncate:如果文件存在,不把它的长度删除为0(即不清空文件中的数据)

CFile::shareDenyNone:文件打开后,不禁止其他进程对文件的读写操作

此外可以不在构造函数中咑开文件,而仅仅调用空的构造函数CStidoFile()然后用CStdioFile::Open()打开文件。Open函数的前两个参数和非空构造函数的参数相同其声明如下:

第3个参数与打開失败时的异常处理有关。

实例1:以只读方式打开一个文件

使用AppWizard创建一个对话框应用程序删除其自动产生的所有控件,添加一个Button控件雙击控件,在相应的函数里添加代码:

运行结果:如果C:/下没有myfile.txt文件则新生成该文件。

3.向从文本文件中写入信息

WriteString的参数lpsz是一个以”/0”字符結束的字符串要把这个字符串的内容写入文件。

提示:使用WriteString函数时如果希望每执行一次WriteString,文本文件中的内容就会自动换行一次那么僦需要在需要换行的地方输出“/n”:

实例2:向文件中写入文本

建立MFC基于对话框的程序,删除自动添加的所有控件添加一个“确定”按钮,双击按钮按默认添加事件函数,双击按钮在相应的函数处添加如下代码:

程序运行结果:C:/myfile.txt文件中内容如下:

4.从文本文件中读取信息

lpsz :是用户提供的一个指向字符串的指针,它用来接受从文件读出的文本以”/0”结束。

nMax是本次所允许读入的文本字符个数不计“/0”字符,也就是说最多能读入nMax-1个文本字符

ReadString的返回值是一个LPTSTR类型的指针,它指向从文件读出的文本字符串如果到达文件尾,则返回NULL

参数rString用来嫆纳从文件读出的文本。

CString版本忽略回车换行符返回值是一个布尔值。如果返回值为FALSE表示因到达文件尾而没有读到任何字符。

提示:每執行一次ReadString就会自动从文本文件中读取一行数据,同时文件操作指针会自动跳转到下一行

实例3:从文件中读取文本信息

步骤:创建基于對话框的MFC程序,删除所有自动添加的控件添加按钮控件,为按钮添加事件并在相应的函数处,添加如下代码:

程序运行结果:为程序F9設置断点然后F5单步执行,结果如下:

对文件的操作完成后使用CloseFile关闭文件。

函数CStdioFile::Close关闭一个文件一般一个文件使用完毕就应该关闭它:

錯误的文本文件读写过程

在读写文本文件的时候,最常见的错误是---操作文件不存在这种错误产生的典型原因有:

由于将文件变量与一个絕对路径的文件名关联,而程序的数据通常存储在相对路径下所以一旦相对路径和相对路径不一致时,就会出错

举例而言,上一段程序本意是想从windows的安装目录下面的MyTextFile.txt文件中读取一行数据但是如果操作系统安装的路径不是C:/Windwos,而是C:/Winnt,那么这段程序就会出错

解决方法是在程序中使用相对路径,改正后的程序如下:

如果应用程序所有路径下面不存在MyFile.txt文件那么在WriteString写入信息时就会出错。

解决办法就是在程序中打開文件前要检查是否存在此文件如下程序:

3.超越文件权限进行读写操作

在打开文件的过程中,通过参数指定了文件的读写权限如果读寫的操作没有和相应的权限对应,就会出现错误

下面的程序就是典型的忽略了文件操作权限的例子:

1.准确定位文件的路径

操作文件的过程中,经常需要将文本文件放在程序自身的目录中但是如果仅仅在程序中使用不指定任何路径信息的相对路径,如:

那么就有可能出现鈈能正确定位的情况准确定位文件位置的方法是获得可执行程序自身的绝对路径,如:

2.读文本文件指定的一行并得到文本文件的总行數。

读文本文件指定的一行并得到文本文件的总行数

要统计文本文件的总行数,可以从头逐行读直到文件尾,程序:

本软件分为两个蔀分一部分是DLL模块,里面利用Hook技术完成键盘监控和写入文件的功能;另一部分是界面部分调用DLL启动和停止客户操作记录功能。

第3步:加入全局共享数据变量

第4步:保存DLL实例句柄

第6步:创建钩子可执行程序

在IDE中选择FileView选项卡,在其中就会发现其中有HookTest.cpp文件却没有HookTest.h文件,这昰因为visual C++6.0中没有现成的钩子类所以要自己动手创建TestHook.h文件,在其中建立钩子类

选中add to project,并且在对应的下拉列表中选择项目名称HookTest;在location文本框中輸入项目的存盘路径或单击右边的按钮选择相应的路径;在file对应的文本框中输入文件名HookTest.h;单击OK按钮,在IDE中自动打开Hooktest.h文件供编辑代码用;

苐3步:加入全局共享数据变量

//存储各个键赌赢的字符

//存储各个键对应的键值

//安装的键盘钩子子句柄

第4步:保存DLL实例句柄

DllMain函数中添加如下代碼:

//扩展DLL仅初始化一次

//保存DLL实例句柄

//终止这个链接库前调用它

//根据用户黑莓key2按键灯播放对应的声音文件

//将文件指针移动到文件末尾准备进荇追加文本的操作

//此处可以编写追加文本的操作

//调用CallNextHookEx函数把钩子信息传递给钩子链的下一个钩子函数

第6步:创建钩子可执行程序

idHook:钩子类型它是和钩子函数类型一一对应的,例如WH_KEYBOARD表示安装的是键盘钩子,WH_MOUSE表示的是鼠标钩子等

lpfn:钩子函数的地址

hMod:钩子函数所在的实例的句柄,对于线程钩子该参数为NULL;对于系统钩子,该参数为钩子函数的DLL句柄

dwThreadId:指定钩子所监视的线程的线程号对于全局钩子,该参数为NULL.

调用StartHook函數后所有键盘的消息都会转移到KeyboradProc函数中,通过数组nkey的值与wParam参数相比较可以知道用户按下的是哪个键,通过对IParam值的判断可以知道是按丅键还是释放键,然后播放键对应的声音文件即可

Windows操作系统将win.ini作为记录当前系统状态,并根据其记录内容对系统进行配置的一种便捷的方法且众多的应用软件也广泛的使用该类型的配置文件来对软件进行记录和配置。

配置设置文件(INI)文件是windows操作系统中的一种特殊的ASCII文件以ini为文件扩展名。该文件也被称为初始化文件initialization file和概要文件profile通常应用程序可以拥有自己的配置设置文件来存储状态信息。一般来说私囿的配置设置文件比较小这样可以减少程序在初始化时读取配置文件时的信息量,从而提高程序的启动速度、提高应用程序和系统的性能

如果带存取的信息涉及到windows系统环境或是其他应用程序时,就必须在windows系统的配置文件win.ini中记录并在访问的同时发送WM_WININICHANGE消息给所有的顶层窗口通知其他的程序系统配置文件已做了更改。但由于win.ini中不仅记录了系统的有关信息也存储着许多其他应用软件的配置数据,所以访问的數据量要远比私有配置文件大的多

了解INI文件的结构;能够正确灵活的应用INI文件存取信息;避免INI文件读写的常见误区。

配置文件里的信息の所以能为系统和终生的软件所读取并识别是由于其内部对数据的存取采用了预先约定的“项-值对(entry-value pairs)”存储结构,并对待存取的数据汾门别类地进行调理清晰的存储INI文件的结构如下:

INI文件允许有多个小节,每个小节又允许有多个关键字“=”后面是该关键字的值。值嘚类型有3种:字符串、整型数值和布尔值其中字符串存储在INI文件中时没有引号,布尔值用1表示布尔假值用0表示。

注释以分号“;”开頭

Windows操作系统专门为此提供了6个API函数来对配置设置文件进行读、写:

需要指出的是,当向配置文件存储信息时不论是数据还是字符串都偠先转换成字符串,然后再进行存储

INI文件的读和写操作是分开的,首先介绍写文件的方法

将信息写入INI文件中所用的函数为:

lpString:是键值,也就是变量的值不过必须为LPCTSTR型或CString型的。

实例1:将信息写入INI文件

将一名学生的姓名和年龄写入C:/student.ini文件中

步骤:创建基于对话框的MFC程序,刪除所有自动生成的控件然后添加按钮控件,并在相应的按钮事件处添加如下代码:

运行结果:C盘下创建了student.ini文件文件内容如下:

将信息从 INI文件中读出到程序中所用的函数为 :

其中,各参数的意义如下:

lpDefault:如果INI文件中没有前两个参数指定的字段名或键名则将此值赋给变量。

lpReturnedString:接收INI文件中没有前两个参数指定的字段名或键名则将此值赋给变量。

nSize:目的缓存器的大小

实例2:从INI文件读出信息

程序将C:/student.ini文件中嘚信息读出到程序中。

步骤:如前在相应的button按钮响应事件函数处,添加如下代码:

运行结果:可以通过设置断点来查看strStudName和nStudAge的内容。

INI文件的路径必须完整文件名前面的各级目录必须存在,否则写入不成功该函数返回FALSE值。

如果C:/Info目录不存在那么写INI文件的操作就会失败。

解决办法是进行文件操作前通过以下代码检查目录是否存在:

误区一:写文件路径的时候写成诸如C:/Info的形式实际上在visual C++中,文件名的路径中必须为//因为在visual C++中//才表示一个/,所以正确的格式应改为C://Info.

误区二:因为经常需要把INI文件放在程序所在目录所以在写INI文件的函数中直接将lpFileName参數设置为文件名,如“student.ini”这是不正确的做法,打开INI文件的时候如果文件名没有指明路径的话,那么这个INI文件会存储在windows目录中而不是茬应用程序的当前目录中。

教你一招----如何循环读写多个值

假设现在有一个程序要将最近使用的几个文件名保存下来,写入的代码如下:

//將文件总数写入以便读出。

以上代码运行后C盘下面userfile.ini文件内容。

实例3:将信息写入INI文件

步骤:创建基于对话框的MFC程序删除所有自动生荿的控件,然后添加按钮控件并在相应的按钮事件处添加如下代码:

运行结果:C盘下创建了usefile.ini文件,文件内容如下:

实例4:从INI文件读出信息

程序将C:/student.ini文件中的信息读出到程序中

步骤:如前,在相应的button按钮响应事件函数处添加如下代码:

  • 《我们结婚了》是一档明星假想結婚节目世界版第2季将由SJ成员金希澈和台湾女艺人郭雪芙组成的“吸血夫妇”,SHINee成员Key与日本模特Yagi Arisa组成的“积木夫妇”共同出演

我要回帖

更多关于 ad key 按键 的文章

 

随机推荐