Archive for 07月, 2007

用户界面设计――用好的设计替代不好的

原文: User Interface Design - Taking the Good with the Bad
成功的婚姻之关键在于折衷。当事情沿着你不希望的方向发展,在最后,形成的争论却可以为你带来极大的好处。这条定理同样适用于用户界面设计。毕竟,如果婚姻不是形式和仪式又是什么呢?
设计用户界面的过程从根本上就是折衷的训练。这个训练并非指设计者和项目负责人之间的折衷(可用性从来没被办公室政治利用过),而是指设计方案的倒退和前进之间的折衷。每一个有关用户界面的决定,从一像素的精确定位到整个网站的信息架构都需要深思熟虑。对每一个设计方案给用户带来的好处与花费两者之间的仔细权衡才是本质。人们常常忽略有时是很小的代价,但每一个用户界面设计都要付出的代价。经过考虑的折衷原则其实贯穿了所有的用户界面设计,但在设计最佳的用户界面时,具有讽刺的是,它还要求你避免设计折衷的界面。
你不能吃了蛋糕还想拥有它
在创作用户界面的时候,你必须处理两个主要且冲突的局限:在仅有的一个显示器上传达海量的信息;用户在一定时间内接受海量的信息。在一个显示器上显示太多的内容,用户不得不从混沌中“艰难跋涉”了;显示太少的信息,用户为了找到他们的目标,又不得不靠猜测了。好的设计应该在程序和用户之间找到平衡点,既有效利用屏幕,又能考虑用户理解信息的能力。
你的舞台(显示器)是有局限的――毕竟有x像素的宽和y像素的高。这意味着资源很重要,你利用的每个象素都可看作是有价格的。当你试图去创建一个用户界面的时候,保持信息密度的平衡是项挑战。每个设计方案都要经过深思,因为在屏幕上每增加一块内容就加大了信息密度,这对用户有限的精力和认知过程是个挑战,使得用户更难弄明白了。
好的设计代替不好的
无论何时,花费只要能带来好处,采取折衷原则也是可以的。理论上,你可以最大化好处和最小化坏处,但本质问题是,所带来的好处能否超过其花费?不仅仅是超过,在所有可选的设计方案中,它能否带来最大利润?果真如此,它才是最佳方案。
花费/好处的折衷考虑穿越了用户界面开发的所有层次,从导航设计到字体大小。越是重要的设计方案,越是体现出用户界面巨大而潜在的影响。小的设计方案看起来似乎无关紧要,但积少成多,也会对用户界面产生潜在影响。无论大小,每一个设计方案都应该在可用性评估和考虑网络用户界面好处之后再决定。
一些对比的设计方案

设计
好处
花费

减少信息构架的层次
找到信息时减少了点击
更混乱

深层信息架构
清晰,减少混乱
找信息时点击多

小字体
一屏上显示更多信息
某些用户太难阅读了

大字体
阅读起来容易
每屏信息少了

下拉框
在有限空间里容下了更多选项
隐藏了选项

单选框
同一时间看到更多选项
需要更多空间,易混淆

图标
一旦记住就容易辨认了;视觉愉悦
M要学习识别

文字链接
总是易懂的
一旦不理解,可能必须阅读更多的资料

缩写
节约空间
需要学习和识别

非缩写
易懂
需要额外空间

键盘快捷键
数据高速输入
需要学习

鼠标指向和点击
直觉的
交互增加了额外的时间,需要更多的经验

疯狂背后的模式
事实上,你无法刻意评估每项设计方案的优劣。此过程就像天性一样,你可以凭直觉判断哪里该用下拉菜单还是单选按钮,或者此设计是不是比另一个略胜一筹。但直觉是建立在相关经验和努力之上的。设计的折衷评估仍旧可能发生,它在潜意识中形成了。这种潜意识行为可能让你没意识到为什么选择了此项,而非另一项方案。但如果你拆开了这个过程,其核心就是基于可用性原则的判断。
在设计过程中描述这个潜在法则可能并非必须,它很自然就发生了,但是你必须清楚,并在逻辑上意识到你的设计。如果你和别人一起工作,他们的建议可能降低了可用性,你意识到自己的决定是如何产生的就很重要了。通过将用户界面设计中潜意识的行为化作语言,你可以为坚持自己的决定增加了砝码。但如果你让每个人都对界面设计提出一种意见(就像恐怖的会议讨论),界面可能会像过去那样难看了。
好 C 坏 = 网络可用性
你是否注意到你可以立刻指出各种界面设计的不足?这是因为在界面设计时的折衷原则使然。甚至最好的设计解决方案都可能有些倒退,一些成员可能会尝试改变设计。但任何设计都有不足之处,每一个无不如此。这样的不足还不至于损害设计。一个设计比另一个设计更好的地方在于无时无刻不照顾到网络可用性。所以,好-坏=网络可用性。最后测量的标准就是网络的可用性价值。
批评开始满天飞了。字体太小了、图标含义不清、缩写词意不明。也许最初只是脸红一下,然后就红到耳根了,仿佛这些批评都是对的一样。事实上,这类宣言单独来看都是正确的,但它太过正确,也应该被挑战。来决定它值不值,就要既考虑花费,又要考虑好处了。后台设计者能立刻识别一个特殊设计的花费,但是他们看不到好处。你需要客观的评估每个建议对可用性的影响,从而决定哪个是最可取的。
除了要懂得界面设计中的折衷性,你也应该鼓励那种有缺陷的设计建议。为了有效评估那些作用于界面设计的花费和好处,你需要涉猎多种领域:从认知学到人因学到图形设计。只有对人们如何与应用程序交互建立了巨大的知识储备,你才能更有效地评估用户界面设计。这不仅仅是个非对即错的事情,因为花费总是与带来的好处相关。
举例来说,你的页面字体可能小了,对一些老年人相当难以阅读。这就是花费。但这在一屏上提供了更多的信息,也意味着更少的滚动,减少滚动可以降低物理操作和认知输入。现在假设统计出你的用户年龄90%在21至30岁之间,因此比较其他解决方案,这时字体更小一些会更好,网络的可用性也更高。
所选的方案并非完美,但它提供了更好的可用性。你也可以提出异议,用好的替代坏的设计,但对于你特定的应用,选择这种方案无非是最明智的。你必须在完整的程序使用中加以衡量,才能选出最合适的方案。
懂得在界面设计中无所不在的折衷原则,并应该灌输给整个项目组,甚至每个普通员工都要知晓。对用户界面的争论应该被鼓励。在每一个设计方案中通过理解、评估和解释折衷原则,你可以设计可用性更高和更有说服力的界面。
对成功的评估
当评估一个设计是否更好时,又需要一个用户界面准则去评估,以下是几个用户界面质量的元素:

容易学习并容易记住
使用的有效性
出错率,可伸缩性和可恢复性
个人满意度

以应用程序的最后使用效果评定,每一个因素都可能是重要的。举例来说,使用的有效性也许对高端的用户程序有用,而对小册子市场就不一定那么有效了。虽然这种转变可能会提高个人满意度。但每一个设计决定都应该接受上面四个因素的考验。
广泛折衷原则
折衷也不应该以屏幕设计为终点。在用户界面设计中占据了很大分量的包括:网络信息统计(比如什么浏览器、平台、显示效果尺寸等)、瘦/胖/富客户端体系、开发时间和花费的资源等。在评估折衷时,可用性占据了极大的分量,但真实使用环境中的一些问题也日趋重要。比如说,如果一个设计方案比另一个好得多,是否值得用1万美元开发它?这部分功能的提升值得吗?反过来想,节约的这些钱是否削弱了可用性?这类讨论是如此现实,需要被谨慎评估。
只要认识到用户界面设计是建立在折衷上的,会帮助我们清楚地认识到为什么如此设计。这样做会减少优秀界面设计出轨的风险,尤其对那些只看到事物一个方面的人有用。通过清晰地列出花费、好处和相互交流设计的意义,你可以更好地说明别人、得到更多的支持。总之,如果我们能依照折衷的原则,我们就能正确地看待好处和坏处。只是希望别带给我们丑陋的事物。(完)

Windows界面设计标准

1.1.   Windows 界面设计标准
1.1.1 . 易用性
      界面元素的名称、标签应该易懂,用词准确,避免使用模楞两可的字眼,要与同一界面上的其他元素易于区分,能望文知意最好。理想的情况是用户不用查阅帮助就能知道该界面的功能并进行相关的正确操作作。
      disable 而不是not visible。
      完成相同或相近功能的按钮用GoupBox框起来,常用按钮要支持快捷方式。
      完成同一功能或任务的元素放在集中位置,减少鼠标移动的距离。
      按功能将界面划分局域块,用GoupBox框括起来,并要有功能说明或标题。
      界面要支持键盘自动浏览按钮功能,即按Tab键的自动切换功能。
      界面上首先应输入的和重要信息的控件在Tab order中应当靠前,位置也应放在窗口上较醒目的位置。
      同一界面上的控件数最好不要超过10个,多于10个时可以考虑使用分页界面显示。
      分页界面要支持在页面间的快捷切换,常用组合快捷键Ctrl+Tab
      默认按钮要支持Enter选定及鼠标选择操作,即按Enter后自动执行默认按钮对应操作。
      可写控件检测到非法输入后应给出说明并能自动获得焦点。
      Tab 键的顺序与控件排列顺序要一致,总体遵守从上到下,同时行间从左到右的方式。
      复选框和选项框按选择几率的高底而先后排列。
      复选框和选项框要有默认选项,并支持Tab键选择。
      界面空间较小时使用下拉框而不用选项框。
      选项数较少时使用选项框,相反使用下拉列表框。
      专业性强的软件要使用相关的专业术语,通用性界面则提倡使用通用性词眼。
1.1.2 . 规范性
      通常界面设计都按Windows界面的规范来设计
      小型软件可以不提供工具栏。
      常用菜单要有命令快捷方式。
      完成相同或相近功能的菜单用横线隔开放在同一位置。 [...]

密幕后:国内共享软件的十大杀手

影响共享软件发展的因素很多,被非法破解可以说是共享软件的头号大敌。那么造成共享软件生存困难的cracker们到底用了那些武器呢?今天就让我让带您去看看神秘的cracker常用的十类软件,它们就是共享软件的十大杀手!
  一. 调试类工具soft-ice和trw2000。
  soft-ice是目前公认最好的跟踪调试工具。使用soft-ice可以很容易的跟踪一个软件、或是监视软件产生的错误进行除错,它有dos、window3.1、win95/98/nt/2000/各个平台上的版本。这个本是用来对软件进行调试、跟踪、除错的工具,在cracker手中变成了最恐怖的破解工具;trw2000是中国人自己编写的调试软件,完全兼容soft-ice各条指令,由于现在许多软件能检测soft-ice存在,而对trw2000的检测就差了许多,因此目前它成了很多cracker的最爱。trw2000专门针对软件破解进行了优化,在windows下跟踪调试程序,跟踪功能更强;可以设置各种断点,并且断点种类更多;它可以象一些脱壳工具一样完成对加密外壳的去除,自动生成exe文件,因此它的破解能力更强,在破解者手中对共享软件的发展威胁更大。它还有在dos下的版本,名为tr。
  二. 反汇编工具wdasm8.93黄金版和hiew。
  cracker常将soft-ice和trw2000比作屠龙刀,将wdasm8.93则比作倚天剑。wdasm8.93可方便地反汇编程序,它能静态分析程序流程,也可动态分析程序。在原有的普通版的基础上,一些破解者又开发出了wdasm8.93黄金版,加强了对中文字符串的提取。对国产共享软件的威胁也就更大了。例如开心斗地主这个很好玩的共享软件,用黄金版对其反汇编可以直接看到注册码,普通版不能,您说它厉害不?hiew是一个十六进制工具,它除了普通十六进制的功能外,它还有个特色,能反汇编文件,并可以用汇编指令修改程序, 用它修改程序,方便快捷!这也是cracker们常用的静态反汇编工具。
  三. visual basic程序调试工具smartcheck。
  这是专门针对visual basic程序的调试程序,由于vb程序执行时从本质上讲是解释执行,它们只是调用 vbrunxxx.dll 中的函数 ,因此vb 的可执行文件是伪代码,程序都在vbxxx.dll 里面执行。若用soft-ice跟踪调试只能在vbdll里面用打转转,看不到有利用价值的东西,而且代码质量不高,结构还很复杂。当然只要了解其特点用soft-ice也可破解 ,但smartcheck的出现,大大方便了cracker。smartcheck 是 numega 公司出口的一款出色的调试解释执行程序的工具,目前最新版是v6.03。它非常容易使用,你甚至于不需要懂得汇编语言都能轻易驾驭它。它可将vb程序执行的操作完全记录下来,使破解者轻而易举的破解大部分vb程序。
  四. 十六进制编辑器ultraedit。
  十六进制编辑器可以用十六进制方式编辑文件,修改文件的内容。虽然hiew就是一款是十六进制工具,但它是dos界面,因此很多破解者又准备了一款windows下的工具,这样的工具很多,如:ultraedit、winhex、hex workshop 等,其中ultraedit比较有特色,操作方便,更有汉化版可用,它是非常出色的十六进制编辑器,建议您也找一个用用。
  五. 注册表监视工具
  主要有regshot、regmon或regsnap等。在微软操作系统中,众多的设置都存放在注册表中,注册表是windows的核心数据库,表中存放着各种参数,直接控制着windows的启动、硬件驱动程序的装载以及一些windows应用程序的正常运行。在应用软件安装时,有可能将一些必要的信息放进去,如安装时间、使用次数、注册码等。regshot、regmon或regsnap就是监视注册表变化的工具,通过它可以了解、监视应用程序在注册表中的动作,破解者常利用它们来监视应用程序在注册表中的变化。
  六. 文件监视工具filemon。
  可监视系统中指定文件运行状况,如指定文件打开了哪个文件,关闭了哪个文件,对哪个文件进行了数据读取等。通过它,任何您指定监控的文件有任何读、写、打开其它文件的操作都能被它监视下来,并提供完整的报告信息。破解者经常利用filemon监控文件系统,以便了解程序在启动、关闭或验证注册码时做了哪些手脚,并由此进行相应的解密。
  七. 脱壳工具procdump。
  现在许多软件都加了壳,“壳”是一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。经过加壳的软件在跟踪时已无法看到其真实的十六进制代码,因此可以起到保护软件的目的。procdump就是个对付软件加壳的脱壳工具,它可剥去许多种壳,还文件本来面目,这样再修改文件内容就容易多了。由于它还允许使用者自己编写脚本文件,因此利用它能脱去新版加壳软件的壳。它同时还是一款优秀的pe格式修改工具,是脱壳必备工具!
  八. 侦测文件类型工具
  这样的工具有typ、gtw、fileinfo和冲击波2000等。它们被用来侦测软件被加壳类型,其中冲击波2000能轻易的找到任何加密壳的入口点,包括asprotect以及幻影的加密壳都可以。这类软件一般是配合procdump和调试软件使用的,用它们找到程序加壳类型,用procdump或soft-ice、trw2000脱壳。
  九. 资源修改器 exescope。
  exescope是一个可以修改软件资源的工具,功能强大。 exescope能在没有资源文件的情况下分析、显示不同的信息,重写可执行文件的资源,包括(exe,dll,ocx)等。它可以直接修改用 vc++ 及 delphi 编制的程序的资源,包括菜单、对话框、字串表等,是汉化软件的常用工具。在破解者手中,它常被用来修改文件资源中的菜单、对话框、字串表等,用以显示破解者需要的信息(例如更改版权信息等),以此达到修改软件的目的。
  十. api调用查询工具api spy。
  顾名思义,这个程序是用来侦测软件都调用了哪些api。 api就是windows程序执行时所呼叫的函数,跟dos下的int(中断)差不多,windows 提供了很多这样的函数让程序设计者套用,主要目的是为了节省软件开发的时间,方便大家开发软件。api spy就是这样一个监控api调用的软件,它可以查看应用程序调用了哪些api,从而得出对破解者有用的api调用信息,通过这些api调用来设定断点,达到破解软件的目的。它可以工作在windows95/98/nt/2000平台下。 [...]

启动和开启系统服务全家福

‘API
Option Explicit
Private Type SERVICE_STATUS
     dwServiceType As Long                ‘指示服务类型,创建 Win32 服务。赋值 SERVICE_WIN32
     dwCurrentState As Long               ‘指定服务的当前状态。因为服务的初始化在这里没有完成,所以这里的状态为 SERVICE_START_PENDING
     dwControlsAccepted As Long           ‘这个域通知 SCM 服务接受哪个域。
     dwWin32ExitCode As Long              ‘这两个域在你终止服务并报告退出细节时很有用。初始化服务时并不退出,因此,它们的值为 0
     dwServiceSpecificExitCode As Long
     dwCheckPoint As Long                 ‘这两个域表示初始化某个服务进程时要30秒以上
     dwWaitHint As Long
End Type
‘OpenSCManager打开服务管理数据库
‘参数:
‘lpMachineName:    本地计算机
‘lpDatabaseName:   默认的数据库
‘dwDesiredAccess: 所需的访问权
Private Declare Function OpenSCManager Lib “advapi32.dll” Alias _
                           “OpenSCManagerA” (ByVal lpMachineName As String, _
                           ByVal [...]

Full source of Service Program

‘Please Include Reference in your program
‘ VB-friendly NT Service API Functions
‘******************************************************************************
‘Module   :
‘Service Name :     frmService
‘Database   :
‘Created By :     C. Raghuraja, India
‘Created Date         :     05-Jan-2005
‘Description :     Service Source Program
‘******************************************************************************
Option Explicit
‘******************************************************************************
     ‘————————————————————————
     ‘ Win API 関数
     ‘————————————————————————
     Private Declare Function CreateThread Lib “kernel32″ (ByVal lpThreadAttributes As Long, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal [...]

几个实用的模块化代码

=========================================================
‘判断文件是否存在
Function FileExist(FileName As String) As Boolean
On Error Resume Next
Dim FileNum As Integer
FileNum = FreeFile()
Open FileName For Input As #FileNum
If Err = 0 Then
FileExist = True
Else
FileExist = False
End If
Close #FileNum
End Function
‘获取程序本身所在的目录(返回的字符以“\”结尾)
Function Path() As String
If Len(App.Path) <= 3 Then
Path = App.Path
Else
Path = App.Path & "\"
End If
End Function
‘获取系统目录(SYSTEM)路径
Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, [...]

AVPhone 的一些说明

目前还没有在 .Net 下对它进行详细测试,但由于它是标准的 ActiveX,.Net 应该支持吧!
你可以在 .Net 中尝试直接打开 “HelloWorld” 示例程序,如果可以工作,那就没有什么问题了。对于同步 AVPhone 控件有所考虑,但同步不是绝对的,而是在一个可以接受的范围内动态变化。AVPhone 控件是视频及音频的实时捕获、压缩及回放控件,本身并不包含任何传输,但它使用了简单实用的接口,你可以容易地通过 Winsock 把数据传到任意一个或多个远端。
下面是一个简单的控件使用概要:

AVPhone 是一个用于实时视频和音频捕获、压缩、回放及存储的控件组。AVPhone 采用 VFW 及 WaveForm 技术编制,支持意ACM和ICM压缩引擎,包括H263及G723和MPEG4,捕获后的数据直接压缩到内存Byte数组内,可不产生文件,也可以直接写入AVI文件内。
安装程序中包含MyAVPhone示例程序,可在网上打可视电话。它包含四个控件:
1:VidCap,用于视频的内存级捕获及压缩。
第一步:连接视频设备: VidCap.Connect
你的系统内必须装有合乎 VFW 标准的视频捕获设备,在连接时你可以指定一个索引来连接到你想连接的设备,
如果忽略,VidCap 将连接到系统中第一个可用的视频设备。
第二步,调用 StartCapture 方法后,VidCap 立即开始捕获视频,每当捕获并压缩一帧图象,就会有 Frame
事件产生,其中参数 Data 为一 Byte 数组包含了图象数据。你可以在此操纵 Data 存盘或由传输通路例如
Winsock 发送到远端。VidCap.BitmapFormat 为一 Byte 数组中包含了压缩图象的格式。
第三步:本步骤是可选的。
选择ICM 压缩引擎: VidCap.Compressor = “h263″,当然,你可以把当前你系统的任意压缩引擎的四字节描述付给 VidCap。默认情况下 VidCap 使用 iv50 格式压缩图象,你可以仅仅通过一个名字就来指定任意的压缩引擎包括 MPEG4 来压缩图象。你也可以调用 VidCap.CompressorDlg 由用户自由选择。对于某些 ICM,在被打开之后必须要有 [...]

36字诀让你受用一生

在网上偶然看到这篇帖子,觉得很受用,特摘抄下来,时刻警醒自己。
         一个人不管有多聪明,多能干,背景条件有多好,如果不懂得如何去做人、做事,那么他最终的结局肯定是失败。

  做人做事是一门艺术,更是一门学问。很多人之所以一辈子都碌碌无为,那是因为他活了一辈子都没有弄明白该怎样去做人做事。

  每一个人生活在现实社会中,都渴望着成功,而且很多有志之士为了心中的梦想,付出了很多,然而得到的却很少,这个问题不能不引起人们的深思:你不能说他们不够努力,不够勤劳,可为什么偏偏落得个一事无成的结局呢?这值得我们每一个人去认真思考。

  从表面上看,做人做事似乎很简单,有谁不会呢?其实不然,比如说你当一名教师,你的主观愿望是当好教师,但事实上却不受学生欢迎;你去做生意,你的主观愿望是赚大钱,可偏偏就赔了本。抛开这些表层现象,去发掘问题的症结,你就会发现做人做事的确是一门很难掌握的学问。

  可以这么说,做人做事是一门涉及现实生活中各个方面的学问,单从任何一个方面入手研究,都不可能窥其全貌。要掌握这门学问,抓住其本质,就必须对现实生活加以提炼总结,得出一些具有普遍意义的规律来,人们才能有章可循,而不至于迷然无绪。

  读懂一个字诀,受用你一生!

  一、社会交往字诀

  ――教你建功立业

  (一)“谦”字诀

  处世唯“谦”字了得,若一味狂妄自负、骄傲自大,只会失去处世的根本,落得个孤苦伶仃、千夫所指的骂名下场。

  1、不可目中无人

  2、得意不要忘形

  3、有本事不必自夸

  4、请教不择人

  (二)“淡”字诀

  为人处世,交朋待友,对势利纷华,似乎不必太过于苛求,当以“淡”字当头。看淡些,看开些,人生也就豁然开朗,有滋有味了。

  正如“平平淡淡才是真”。

  1、君子之交淡如水

  2、淡看人生,善待生命

  3、淡泊明志,莫为名利遮望眼

  4、减少心欲,满足心灵

  (三)“俭”字诀

  不懂得“俭”字的人,不知道如何成功,任何成功的事业都在于点滴的积累;不懂得“俭”字的人,只会丧失成功,过分的骄奢多败人品质。

  “俭以养德”,为人做事之良训。

  1、从节省生活费开始

  2、“穷大方”不可取

  3、谨防变 态的节俭:吝啬

  4、欲路勿染,俭以养德

  (四)“自”字诀

  做一个有个性的人,给自己一点自信!成功的道路靠自己闯,美好的前途来自于自强自立,不屈服于任何权威,用自我的努力找到属于你的自尊。

  男儿立世,自己拍板!

  1、自强自立,与成功有约

  2、独品人生百态

  3、用自我来挑战权威

  4、自信――任你东南西北风

  (五)“礼”字诀

  生在礼仪之邦,做一个彬彬有礼之人。有礼之人会做人,有人缘,多朋友。有礼之人会做事,注重形象,有教养,不树敌,成功路上事事顺。

  1、以礼待人

  2、彬彬有礼,礼多人不怪

  3、注重礼仪着装,给人良好印象

  (六)“正”字诀

  做一个正直的人,做一个人格健全完善的人,受人崇敬。做一个自私的人,做欺心的事,疾贤防能,与成功无缘。

  1、己所不欲,勿施于人

  2、嫉妒乃方正之人之大忌

  3、不做欺心事,本身是一种愉悦

  二、形象塑造字诀

  ――教你品格高雅

(七)“志”字诀

  给自己一根足够长的杠杆,希望转动地球。

  给自己的人生立个志愿,树个目标,树个偶像,脚踏实地,成功的意识需要培养,先立志,再与成功约会。

  1、度德量力,以志立身

  2、先立志,有志就有希望 [...]

在VB中调用CHM帮助的几种方法

注:以下方法没有一一测试
一个应用程序不论编制得如何完美,在很多情况下用户还是会对如何使用它提出问题。 Visual Basic 提供了对两种不同帮助系统的支持:传统的 Windows 帮助系统 (WinHelp)和新的 HTML 帮助(CHM帮助)。当我们制作好帮助文件后,就需要在程序的适当位置编写代码进行调用,本文将讨论几种在程序中调用CHM帮助文件的方法。   
方法一 使用F1键:  
这种方法最简单,只需如下代码即可:  
Private Sub Form_Load()   
App.HelpFile = app.path & “\help.chm” ‘调用与主程序同目录下的help.chm帮助文件,按F1键调用  
End Sub  

方法二 使用SendKeys方法:  
Private Sub Form_Load()   
App.HelpFile = app.path & “\help.chm”   
End Sub   
private Sub CmdHelp_Click()   
SendKeys “{F1}” ‘发送击键到活动窗口   
End Sub  

方法三 使用Shell函数:  
private Sub CmdHelp_Click()  
Shell “hh.exe help.chm”, vbNormalFocus ‘help.chm为指定的帮助文件,可包含路径。  
End Sub  

方法四 使用HtmlHelp函数:  
先声明如下API:  
Option Explicit  
Private Declare Function HtmlHelpA Lib “hhctrl.ocx” (ByVal hwndCaller As Long, ByVal pszFile As String, ByVal [...]

给程序指定热键

Option Explicit
     Private Declare Function SendMessage Lib “user32″ Alias “SendMessageA” (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As Long
     Const WM_SETHOTKEY = &H32
     Const HOTKEYF_SHIFT = &H1   ‘ shift键
     Const HOTKEYF_CONTROL = &H2   ‘ctrl键
     Const HOTKEYF_ALT = &H4   ‘alt键
     Const HOTKEYF_EXT = &H8   ‘附加键
     Private Type [...]