说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

也谈Windows 下的自动存盘 -VB资料

HTML文档下载 WORD文档下载 PDF文档下载
也谈Windows 下的自动存盘 -VB资料
郑州铁路分局机电设备厂
冉林仓
---- 我们知道,所谓自动存盘程序就是为了防止系统发生掉电时或者系统崩溃时防止 文件丢失而编制的小程序。有一些大的应用程序(如 WORD 97 、AUTOCAD 2000 等) 一般都设置了自动存盘功能,有的自动存盘是以时间间隔为存盘周期实现自动存盘, 有的则以用户编辑操作次数为基准进行存盘。然而无论那种方法都不可能避免在系统 崩溃时文件的丢失。在DOS情况由于系统内核小,资源占用少,一般除了程序员外用户 很少发生死机现象,或者程序出现例外而异常退出。windows下则不然,庞大的系统造 就了系统稳定性差,经常出现系统异常退出,造成文件丢失的情况。哪怕你正在输入 汉字(微软拼音),也没有招惹谁,输着输着就会出现系统出现非法错误,请重新启 动程序,如问题仍旧存在,请与软件供应商联系的提示框。无论你自嘘你的软件版有 多正,至少在系统出现BUG方面,它与盗版软件没有什么两样。出现了程序异常退出, 这时候哪怕你有天大的本事,也只有捶胸顿足的份了。反正无论是操作系统的原因或 者是应用程序或者是硬件的原因,谁都不会为我们的文件丢失负责任。我们可怜的用 户只能默默的承受这突如其来的打击。

---- 用户不知道如何存盘的几乎没有,然而要他们时时记住每隔三五分钟存一次盘, 确实有点强人所难,除非他们身边放了一个坏的闹钟,每隔三五分钟响一次提醒他 们,一般情况下,这些事业狂们是不输完画完誓不罢休。越是这样反而欲速则不达, 就在他们接近胜利曙光就要大功告成的时候,系统就会给他们开个不该开的玩笑。鉴 于上面所提到的情况,这些用户迫切需要一种工具软件,工作的进度是用户自己的 事,而存盘则是工具软件的事,有了明显的分工,各负其责,文件再丢,就不会再推 诿扯皮了。

---- 我们知道大多数应用程序都有一个标题条(CAPTION),我们可以通过WINDOWS API 中的GetWindows()函数通过不同的参数调用来穷举系统中正在运行的所有的应用程 序。通过GetWindowsText()及GetWindowsTextLength()获得窗口标题文本与长度。然 后在程序中进行分析标题特征,看一下我们要截获的应用程序是否正在运行,如果正 在运行,我们就可以击活这个应用程序,并向这个应用程序模拟键入存盘热键即可, 完成自动存盘,而这些都是工具程序在后台一个独立的进程中完成。根本不会影响用 户输入。

---- 程序说明:

---- ①.程序使用了下列Windows API调用说明如下:

Private Declare Function GetWindow Lib "user32"
(ByVal hwnd As Long, ByVal
wCmd As Long) As Long

---- 利用当前的窗口句柄获得与指定参数wCmd对应的窗口句柄。wCmd定义如下:
---- GW_CHILD 第一个子窗口

---- GW_HWNDFIRST 子窗口的第一兄弟窗口,其第一个顶层窗口

---- GW_HWNDLAST 子窗口的最后一个兄弟窗口,或者最后一个顶层窗口

---- GW_HWNDNEXT 后继窗口

---- GW_HWNDPREV 先前窗口

---- GW_OWNER 窗口拥有者

---- Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long 将句柄HWND指定的窗口标题放在一个字符串lpString 中,cch 为放入字符串lpString 中的 最大长度。若窗口无标题返回 0。

Private Declare Function GetWindowTextLength Lib
"user32" Alias
"GetWindowTextLengthA"
(ByVal hwnd As Long) As Long

---- 用于获得窗口标题的长度
Private Declare Function RegOpenKeyEx Lib
"advapi32.dll" Alias
"RegOpenKeyExA" (ByVal hKey As Long,
ByVal lpSubKey As String, ByVal
ulOptions As Long, ByVal samDesired As Long,
phkResult As Long) As Long
Private Declare Function RegSetValueEx Lib
"advapi32.dll" Alias
"RegSetValueExA" (ByVal hKey As Long, ByVal
lpValueName As String, ByVal
Reserved As Long, ByVal dwType As Long,
lpData As Any, ByVal cbData As
Long) As Long
Private Declare Function RegQueryValueEx Lib "
advapi32.dll" Alias
"RegQueryValueExA" (ByVal hKey As Long,
ByVal lpValueName As String, ByVal
lpReserved As Long, lpType As Long,
lpData As Any, lpcbData As Long) As
Long
Private Declare Function RegCloseKey Lib
"advapi32.dll" (ByVal hKey As
Long) As Long

---- 上面四个函数用于读写注册表信息。以便完成程序的自动加载。函数的具体应用请参 考源程序和有关书籍。需要说明的是BASIC 中的STRING 变量不同于C++中的以零结尾 的字符串变量,需要在变量名前加入ByVal 声明采用传值方式而非传址方式。使用这 些函数将建立“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
\Windows\CurrentVersion\Run 下的键名为“自动存盘程序”键值为应用程序的完整路径。
Private Declare Function SendMessage Lib
"user32" Alias "SendMessageA"
(ByVal hwnd As Long, ByVal wMsg As Long,
ByVal wParam As Long, lParam As
Any) As Long

---- 向窗口发送消息,完成对应的操作。在程序中主要发送SYSCOMMAND 消息实现窗口最小 化。
---- Private Declare Function GetTickCount Lib "kernel32" () As Long

---- 用于返回从上次WINDOWS启动开始到当前的始终嘀嗒数,以诚相待毫秒为单位。

Private Declare Function ShellExecute Lib
"shell32.dll" Alias
"ShellExecuteA" (ByVal hwnd As Long, ByVal
lpOperation As String, ByVal
lpFile As String, ByVal lpParameters As String,
ByVal lpDirectory As
String, ByVal nShowCmd As Long) As Long

---- 用于执行一个程序或者用一个与之相关联的程序打开一个文档可以用于打开浏览器。
---- ②. Visual Basic 程序调用

---- ⑴sendkeys 语句

---- 将一个或多个按键消息发送到活动窗口,就如同在键盘上进行输入一样。

---- 语法

---- SendKeys string[, wait]

---- SendKeys 语句的语法具有以下几个命名参数:

---- 部分 描述

---- string 必要。字符串表达式,指定要发送的按键消息。

---- Wait 可选。指定等待方式的 Boolean 值。如果为 False(缺省值),则控件在按 键发送出去之后立刻返回到过程。如果为 True,则按键消息必须在控件返回到过程之 前加以处理。

---- 为了指定那些与 SHIFT、CTRL 及 ALT 等按键结合的组合键,可在这些按键码的前面 放置一个或多个代码,这些代码列举如下:

按键 代码
SHIFT +
CTRL ^
ALT %

---- 为了说明在按下其它按键时应同时按下 SHIFT、CTRL、及 ALT 的任意组合键,请把那 些按键的码放在括号当中。例如,为了说明按下 E 与 C 的时候同时按下 SHIFT 键, 请使用 "+(EC)"。为了说明在按下 E 的时候同时按下 SHIFT 键,但接着按 C 而不按 SHIFT,则使用 "+EC"。
---- 更多的信息请参考VB 在线帮助。

---- ⑵。AppActivate 语句

---- 激活一应用程序窗口。

---- 语法

---- AppActivate title[, wait]

---- AppActivate 语句的语法具有以下几个命名参数:

---- 部分 描述

---- title 必要。字符串表达式,所要激活的应用程序窗口的标题。可以使用 Shell 函数返回的任务识别码来替换 title,以激活应用程序。

---- wait 可选。Boolean 值,说明在激活另一个应用程序之前调用的应用程序是否有 焦点。如果为 False(缺省),那么,即使调用的应用程序没有焦点,也直接激活指 定的应用程序。如果为 True,则调用的应用程序会等到有焦点后,才激活指定的应用 程序。

---- ⑶。INSTR 语句

---- 返回 Variant (Long),指定一字符串在另一字符串中最先出现的位置。

---- 语法

---- InStr([start, ]string1, string2[, compare])

---- InStr 函数的语法具有下面的参数:

---- 部分 说明

---- start 可选参数。为数值表达式,设置每次搜索的起点。如果省略,将从第一个 字符的位置开始。如果 start 包含 Null,将发生错误。如果指定了 compare 参数, 则一定要有 start 参数。

---- string1 必要参数。接受搜索的字符串表达式。

---- string2 必要参数。被搜索的字符串表达式。

---- Compare 可选参数。指定字符串比较。此 compare 参数是可以省略的,也可以是 0, 1或 2。指定 0(缺省)做二进制比较。指定 1 做不区分大小写的文本比较。仅对 Microsoft Access,指定 2 来做基于数据库中包含的信息的比较。如果 compare 是 Null,将发生错误。如果省略 compare,Option Compare 的设置将决定比较的类型。 返回值

如果 InStr返回
string1 为零长度 0
string1 为 Null Null
string2 为零长度 start
string2 为 Null Null
string2 找不到 0
在 string1 中找到string2 找到的位置
start > string2 0
说明

---- InStrB 函数作用于包含在字符串中的字节数据。所以 InStrB 返回的是字节位置,而 不是字符位置。
---- 注意一个汉字占用一个字符,与DOS下不一样。

---- DIR()

---- 返回一个 String,用以表示一个文件名、目录名或文件夹名称,它必须与指定的模式 或文件属性、或磁盘卷标相匹配。

---- 语法

---- Dir[(pathname[, attributes])]

---- Dir 函数的语法具有以下几个部分:

---- 部分 描述

---- pathname 可选参数。用来指定文件名的字符串表达式,可能包含目录或文件夹、 以及驱动器。如果没有找到 pathname,则会返回零长度字符串 ("")。

---- attributes 可选参数。常数或数值表达式,其总和用来指定文件属性。如果省 略,则会返回匹配 pathname 的所有文件。

---- 设置值

---- attributes 参数的设置可为:

常数 值 描述

vbNormal 0 常规
vbHidden 2 隐藏
vbSystem 4 系统文件
vbVolume 8 磁盘卷标;如果指定,则其它属性都会忽略
vbDirectory 16 目录或文件夹

---- 注意 这些常数是由 VBA 所指定的,在程序代码中的任何位置,可以使用这些常数来 替换真正的数值。
---- ③工程说明。

---- 这个程序有两个窗体一个模块组成。FORM1为主窗体,FORM2窗体主要用于设置需要自 动存盘程序(WORD 、EXCEL、ACESS、POWERPOINT 、VISUAL STUDIO 、AUTOCAD 、CAXA 98 、WORD PAD、FRONTPAGE等等众多应用程序)标题栏包含字符串的特征、 存盘时间间隔数,以及存盘热键。以电子图板CAXA 98为例:

---- 标题栏包含字符串:.exb -Eb-

---- 存盘时间间隔数(秒): 100

---- 存盘热键: CTRL+S

---- 模块主要用于将程序加入系统状态托盘区。它使程序响应左击右击两个事件。

---- FORM1加入了一个时种控件,用于定时检察流逝的时间数。

---- ④程序扩充说明

---- 本文提出了用一个程序操纵另一个程序的构想,特别适用于当你忘记一个文件密 码的时候,你很想穷举所有的可能密码,这对于手工操作是不可能的,你可以使用这 种方法模拟键入,模拟加载应用程序。

---- 对AUTOCAD 的用户可以利用程序中的实现方法,完成一个新图的初始化工作。也 可以利用WM_COPYDATA 消息向AUTOCAD 传送指令和数据。

---- 现列举部分实现片段:

WM_COPYDATA wParam = (WPARAM) (HWND) hwnd;
// 发送窗口的文件柄

lParam = (LPARAM) (PCOPYDATASTRUCT) pcds;
// 数据的结构指针

typedef struct tagCOPYDATASTRUCT { // cds
DWORD dwData;
DWORD cbData;
PVOID lpData;
} COPYDATASTRUCT;

---- 成员
---- dwData 指定传递到接受程序的32位数据

---- cbData 以字节为单位表示指向LPDATA 成员数据大小。

---- lpData 传递到接受应用程序的数据指针,可以为空指针

---- 程序清单

---- 最后需要说明的是此程序旨在抛砖引玉,希望有时间和精力的朋友对其进行完 善。但是程序千变万化,有了这个程序,你千万不要认为吃了定心丸,就万事大吉 了,记住在录入结束或者画完图的时候,一定要先存盘后编译、运行或者模拟显示打 印输出。注意最后一次存盘是用户自己的事,切记!
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘