日志存档:07, 2007

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

2007-07-31,星期二 | 分类:编 程|VisualBasic | 118 views

原文: User Interface Design - Taking the Good with the Bad

成功的婚姻之关键在于折衷。当事情沿着你不希望的方向发展,在最后,形成的争论却可以为你带来极大的好处。这条定理同样适用于用户界面设计。毕竟,如果婚姻不是形式和仪式又是什么呢?

设计用户界面的过程从根本上就是折衷的训练。这个训练并非指设计者和项目负责人之间的折衷(可用性从来没被办公室政治利用过),而是指设计方案的倒退和前进之间的折衷。每一个有关用户界面的决定,从一像素的精确定位到整个网站的信息架构都需要深思熟虑。对每一个设计方案给用户带来的好处与花费两者之间的仔细权衡才是本质。人们常常忽略有时是很小的代价,但每一个用户界面设计都要付出的代价。经过考虑的折衷原则其实贯穿了所有的用户界面设计,但在设计最佳的用户界面时,具有讽刺的是,它还要求你避免设计折衷的界面。

你不能吃了蛋糕还想拥有它

在创作用户界面的时候,你必须处理两个主要且冲突的局限:在仅有的一个显示器上传达海量的信息;用户在一定时间内接受海量的信息。在一个显示器上显示太多的内容,用户不得不从混沌中“艰难跋涉”了;显示太少的信息,用户为了找到他们的目标,又不得不靠猜测了。好的设计应该在程序和用户之间找到平衡点,既有效利用屏幕,又能考虑用户理解信息的能力。

你的舞台(显示器)是有局限的――毕竟有x像素的宽和y像素的高。这意味着资源很重要,你利用的每个象素都可看作是有价格的。当你试图去创建一个用户界面的时候,保持信息密度的平衡是项挑战。每个设计方案都要经过深思,因为在屏幕上每增加一块内容就加大了信息密度,这对用户有限的精力和认知过程是个挑战,使得用户更难弄明白了。

好的设计代替不好的

无论何时,花费只要能带来好处,采取折衷原则也是可以的。理论上,你可以最大化好处和最小化坏处,但本质问题是,所带来的好处能否超过其花费?不仅仅是超过,在所有可选的设计方案中,它能否带来最大利润?果真如此,它才是最佳方案。

花费/好处的折衷考虑穿越了用户界面开发的所有层次,从导航设计到字体大小。越是重要的设计方案,越是体现出用户界面巨大而潜在的影响。小的设计方案看起来似乎无关紧要,但积少成多,也会对用户界面产生潜在影响。无论大小,每一个设计方案都应该在可用性评估和考虑网络用户界面好处之后再决定。

一些对比的设计方案

设计 好处 花费
减少信息构架的层次 找到信息时减少了点击 更混乱
深层信息架构 清晰,减少混乱 找信息时点击多
小字体 一屏上显示更多信息 某些用户太难阅读了
大字体 阅读起来容易 每屏信息少了
下拉框 在有限空间里容下了更多选项 隐藏了选项
单选框 同一时间看到更多选项 需要更多空间,易混淆
图标 一旦记住就容易辨认了;视觉愉悦 M要学习识别
文字链接 总是易懂的 一旦不理解,可能必须阅读更多的资料
缩写 节约空间 需要学习和识别
非缩写 易懂 需要额外空间
键盘快捷键 数据高速输入 需要学习
鼠标指向和点击 直觉的 交互增加了额外的时间,需要更多的经验

疯狂背后的模式

事实上,你无法刻意评估每项设计方案的优劣。此过程就像天性一样,你可以凭直觉判断哪里该用下拉菜单还是单选按钮,或者此设计是不是比另一个略胜一筹。但直觉是建立在相关经验和努力之上的。设计的折衷评估仍旧可能发生,它在潜意识中形成了。这种潜意识行为可能让你没意识到为什么选择了此项,而非另一项方案。但如果你拆开了这个过程,其核心就是基于可用性原则的判断。

在设计过程中描述这个潜在法则可能并非必须,它很自然就发生了,但是你必须清楚,并在逻辑上意识到你的设计。如果你和别人一起工作,他们的建议可能降低了可用性,你意识到自己的决定是如何产生的就很重要了。通过将用户界面设计中潜意识的行为化作语言,你可以为坚持自己的决定增加了砝码。但如果你让每个人都对界面设计提出一种意见(就像恐怖的会议讨论),界面可能会像过去那样难看了。

好 C 坏 = 网络可用性

你是否注意到你可以立刻指出各种界面设计的不足?这是因为在界面设计时的折衷原则使然。甚至最好的设计解决方案都可能有些倒退,一些成员可能会尝试改变设计。但任何设计都有不足之处,每一个无不如此。这样的不足还不至于损害设计。一个设计比另一个设计更好的地方在于无时无刻不照顾到网络可用性。所以,好-坏=网络可用性。最后测量的标准就是网络的可用性价值。

批评开始满天飞了。字体太小了、图标含义不清、缩写词意不明。也许最初只是脸红一下,然后就红到耳根了,仿佛这些批评都是对的一样。事实上,这类宣言单独来看都是正确的,但它太过正确,也应该被挑战。来决定它值不值,就要既考虑花费,又要考虑好处了。后台设计者能立刻识别一个特殊设计的花费,但是他们看不到好处。你需要客观的评估每个建议对可用性的影响,从而决定哪个是最可取的。

除了要懂得界面设计中的折衷性,你也应该鼓励那种有缺陷的设计建议。为了有效评估那些作用于界面设计的花费和好处,你需要涉猎多种领域:从认知学到人因学到图形设计。只有对人们如何与应用程序交互建立了巨大的知识储备,你才能更有效地评估用户界面设计。这不仅仅是个非对即错的事情,因为花费总是与带来的好处相关。

举例来说,你的页面字体可能小了,对一些老年人相当难以阅读。这就是花费。但这在一屏上提供了更多的信息,也意味着更少的滚动,减少滚动可以降低物理操作和认知输入。现在假设统计出你的用户年龄90%在21至30岁之间,因此比较其他解决方案,这时字体更小一些会更好,网络的可用性也更高。

所选的方案并非完美,但它提供了更好的可用性。你也可以提出异议,用好的替代坏的设计,但对于你特定的应用,选择这种方案无非是最明智的。你必须在完整的程序使用中加以衡量,才能选出最合适的方案。

懂得在界面设计中无所不在的折衷原则,并应该灌输给整个项目组,甚至每个普通员工都要知晓。对用户界面的争论应该被鼓励。在每一个设计方案中通过理解、评估和解释折衷原则,你可以设计可用性更高和更有说服力的界面。

对成功的评估

当评估一个设计是否更好时,又需要一个用户界面准则去评估,以下是几个用户界面质量的元素:

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

以应用程序的最后使用效果评定,每一个因素都可能是重要的。举例来说,使用的有效性也许对高端的用户程序有用,而对小册子市场就不一定那么有效了。虽然这种转变可能会提高个人满意度。但每一个设计决定都应该接受上面四个因素的考验。

广泛折衷原则

折衷也不应该以屏幕设计为终点。在用户界面设计中占据了很大分量的包括:网络信息统计(比如什么浏览器、平台、显示效果尺寸等)、瘦/胖/富客户端体系、开发时间和花费的资源等。在评估折衷时,可用性占据了极大的分量,但真实使用环境中的一些问题也日趋重要。比如说,如果一个设计方案比另一个好得多,是否值得用1万美元开发它?这部分功能的提升值得吗?反过来想,节约的这些钱是否削弱了可用性?这类讨论是如此现实,需要被谨慎评估。

只要认识到用户界面设计是建立在折衷上的,会帮助我们清楚地认识到为什么如此设计。这样做会减少优秀界面设计出轨的风险,尤其对那些只看到事物一个方面的人有用。通过清晰地列出花费、好处和相互交流设计的意义,你可以更好地说明别人、得到更多的支持。总之,如果我们能依照折衷的原则,我们就能正确地看待好处和坏处。只是希望别带给我们丑陋的事物。(完)

Windows界面设计标准

2007-07-31,星期二 | 分类:编 程|VisualBasic | 117 views

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界面的规范来设计

      小型软件可以不提供工具栏。

      常用菜单要有命令快捷方式。

      完成相同或相近功能的菜单用横线隔开放在同一位置。

      菜单前的图标能直观的代表要完成的操作。

      菜单深度一般要求最多控制在三层以内。

      工具栏要求可以根据用户的要求自己选择定制。

      相同或相近功能的工具栏放在一起。

      工具栏中的每一个按钮要有及时提示信息。

      一条工具栏的长度最长不能超出屏幕宽度。

      工具栏的图标能直观的代表要完成的操作。

      系统常用的工具栏设置默认放置位置。

      工具栏太多时可以考虑使用工具厢。

      工具厢要具有可增减性,由用户自己根据需求定制。

      工具厢的默认总宽度不要超过屏幕宽度的1/5。

      状态条要能显示用户切实需要的信息,常用的有: 目前的操作、系统状态、用户位置、用户信息、提示信息、错误信息,如果某一操作需要的时间较长,应该显示进度条和进程提示。

      滚动条的长度要根据显示信息的长度或宽度能及时变换,以利于用户了解显示信息的位置和百分比。

      状态条的高度以放置五号字为宜,滚动条的宽度比状态条的略窄。

      菜单和工具条要有清楚的界限;

      菜单要求凸出显示,这样在移走工具条时仍有立体感。

      菜单和状态条中通常使用5号字体。工具条一般比菜单要宽,但不要宽的太多,否则看起来很不协调。

      右键快捷菜单采用与菜单相同的准则。

      如果菜单和按钮将使用户进入一个新的界面,则在标签文本之后加上三句点的省略号 “…”

1.1.3 . 帮助设施

      系统应该提供详尽而可靠的帮助文档,在用户使用产生迷惑时可以自己寻求解决方法。

      帮助文档中的性能介绍与说明要与系统性能配套一致。系统作修改时,相应的帮助文档也应该保持同步更新。

      操作时要提供及时调用系统帮助的功能。常的热键是F1。

      帮助要有即时针对性,在界面上调用帮助时应该能够及时定位到与该操作相对的帮助位置。

      最好提供目前流行的联机帮助格式或HTML帮助格式。

      用户可以用关键词在帮助索引中搜索所要的帮助,当然也应该提供帮助主题词。

      如果没有提供书面的帮助文档的话,最好有打印帮助的功能。

      在帮助中应该提供我们的技术支持方式,一旦用户难以自己解决可以方便的寻求新的帮助方式。

      可以在系统菜单中提供一个about对话框,以快速地提供程序的版本、版权声明和技术支持方式等信息。

1.1.4 . 合理性

      屏幕对角线相交的位置是用户直视的地方,正上方四分之一处为易吸引用户注意力的位置,在放置窗体时要注意利用这两个位置。

      父窗体或主窗体的中心位置应该在对角线焦点附近。

      子窗体位置应该在主窗体的左上角或正中。

      多个子窗体弹出时应该依次向右下方偏移,以显示窗体出标题为宜。

      重要的命令按钮与使用较频繁的按钮要放在界面上注目的位置。

      错误使用容易引起界面退出或关闭的按钮不应该放在易点位置。横排开头或最后与竖排最后为易点位置。

      与正在进行的操作无关的按钮应该加以屏蔽(Windows中用灰色显示,没法使用该按钮)。

      对可能造成数据无法恢复的*作必须提供确认信息,给用户放弃选择的机会。

      非法的输入或*作应有足够的提示说明。

      对运行过程中出现问题而引起错误的地方要有提示,让用户明白错误出处,避免形成无限期的等待。

      提示、警告、或错误说明应该清楚、明了、恰当。

1.1.5 . 美观与协调性

      界面应该大小适合美学观点,感觉协调舒适,能在有效的范围内吸引用户的注意力。

      统一色调,针对软件类型以及用户工作环境选择恰当色调。

      长宽比或宽长比接近黄金点比例,切忌长宽比例失调。

      布局要合理, 不宜过于密集,也不能过于空旷,合理的利用空间。

      相邻或同组的按钮大小相同,同界面上所有的按钮高度相同。

      按钮的大小要与界面的大小和空间要协调。

      避免空旷的界面上放置很大的按钮。

      放置完控件后界面不应有很大的空缺位置。

      字号的大小要与界面的大小比例协调, 字体大小根据系统标准字体来,例如 MSS字体8磅,宋体的小五号字(9磅)五号字(10.5磅)。

      使用正规字体,中文采用标准字体 “宋体”,英文采用标准 Microsoft Sans Serif,不考虑特殊字体(隶书、草书等,特殊情况可以使用图片取代),除非是需要艺术处理或有特殊要求的地方。

      前景与背景色搭配合理协调,反差不宜太大,常用色考虑使用Windows界面色调。

      如果使用其他颜色,主色要柔和,具有亲和力,坚决杜绝刺目的颜色。Graphtalk程序建议以下按钮的风格:

        “确定” 按钮文本颜色设为深蓝

        “取消” 按钮文本颜色设为深红

        “帮助” 按钮文本颜色设为深绿

      大型系统常用的主色有”#E1E1E1″、”#EFEFEF”、”#C0C0C0″等。

      界面风格要保持一致,字的大小、颜色、字体要相同,除非是需要艺术处理或有特殊要求的地方。

      有标准的图标风格设计,有统一的构图布局,有统一的色调、对比度、色阶,以及图片风格。

      底图应该融于底图,使用浅色, 低对比,尽量少的使用颜色。

      鼠标光标样式统一,尽量使用系统标准。

      如果窗体支持最小化和最大化或放大时,窗体上的控件也要随着窗体而缩放;切忌只放大窗体而忽略控件的缩放。

      对于含有按钮的界面一般不应该支持缩放,即右上角只有关闭功能。

      如果需要缩放对话窗,建议以下方式调整每个控件的attachment属性:

          不必变宽的控件,如按钮、静态文本等、采用左上锁定,右下不锁定。

          数据控件,如编辑框、下拉框等,尽可能排放于每行的最右边,采用左上角锁定,右边弹性粘附,

          多行式控件放置于界面最下面端,采用左上右下角全部锁定;

      通常父窗体支持缩放时,子窗体没有必要缩放。

      如果能给用户提供自定义界面风格则更好,由用户自己选择颜色、字体等。

1.1.6 . 菜单

      菜单位置按照按功能来组织。

      菜单通常采用“常用–主要–次要–工具–帮助”的位置排列,符合流行的Windows风格。

      常用的有“文件”、“编辑”,“查看”等,几乎每个系统都有这些选项,当然要根据不同的系统有所取舍。

      下拉菜单要根据菜单选项的含义进行分组,并切按照一定的规则进行排列,用横线隔开。

      一组菜单的使用有先后要求或有向导作用时,应该按先后次序排列。

      没有顺序要求的菜单项按使用频率和重要性排列,常用的放在开头, 不常用的靠后放置;重要的放在开头,次要的放在后边。

      如果菜单选项较多,应该采用加长菜单的长度而减少深度的原则排列。

      菜单深度一般要求最多控制在三层以内。

      对常用的菜单要有快捷命令方式,组合原则见6.1.8。

      对与进行的操作无关的菜单要用屏蔽的方式加以处理,如果采用动态加载方式――即只有需要的菜单才显示――最好。

      菜单前的图标不宜太大,与字高保持一直最好。

      主菜单的宽度要接近,字数不应多于四个,每个菜单的字数能相同最好。

      主菜单数目不应太多,最好为单排布置。

1.1.7 . 独特性

如果一味的遵循业界的界面标准,则会丧失自己的个性.在框架符合以上规范的情况下,设计具有自己独特风格的界面尤为重要。尤其在商业软件流通中有着很好的迁移默化的广告效用。

      安装界面上应有单位介绍或产品介绍,并有自己的图标。

      主界面,最好是大多数界面上要有公司图标。

      登录界面上要有本产品的标志,同时包含公司图标。

      帮助菜单的 “关于” 中应有版权和产品信息。

      公司的系列产品要保持一直的界面风格,如背景色、字体、菜单排列方式、图标、安装过程、按钮用语等应该大体一致。

1.1.8 . 键盘快捷方式

在菜单及按钮中使用快捷键可以让喜欢使用键盘的用户操作得更快,在Windows及其应用软件中快捷键的使用大多是一致的。

菜单中:

      面向事务的组合有:

Ctrl-D 删除 ;Ctrl-F 寻找 ;Ctrl CH替换;Ctrl-I 插入 ;Ctrl-N 新记录 ;Ctrl-S 保存 Ctrl-O 打开。

      列表:

Ctrl-R ,Ctrl-G定位;Ctrl-Tab下一分页窗口或反序浏览同一页面控件;。

      : 编辑:

Ctrl-A 全选;Ctrl-C 拷贝;Ctrl-V 粘贴;Ctrl-X 剪切;Ctrl-Z撤消*作;Ctrl-Y恢复*作。

      文件操作:

Ctrl-P 打印;Ctrl-W 关闭。

      系统菜单

Alt-A 文件;Alt-E编辑;Alt-T工具;Alt-W窗口;Alt-H帮助。

      MS Windows 保留键:

Ctrl-Esc 任务列表 ;Ctrl-F4 关闭窗口; Alt-F4 结束应用;Alt-Tab 下一应用 ;Enter 缺省按钮/确认操作 ;Esc 取消按钮/取消*作 ;Shift-F1 上下文相关帮助 。

      按钮快捷键

可以根据系统需要而调节,以下只是常用的组合。

Alt-Y 确定(是);Alt-C取消;Alt-N 否;Alt-D删除;Alt-Q退出;Alt-A添加;Alt-E编辑;Alt-B浏览;Alt-R读;Alt-W写。

这些快捷键也可以作为开发中文应用软件的标准, 但亦可使用汉语拼音的开头字母。

1.1.9 . 安全性

在界面上通过下列方式来控制出错几率,会大大减少系统因用户人为的错误引起的破坏。开发者应当尽量周全地考虑到各种可能发生的问题,使出错的可能降至最小。如应用出现保护性错误而退出系统,这种错误最容易使用户对软件失去信心。因为这意味着用户要中断思路, 并费时费力地重新登录,而且已进行的操作也会因没有存盘而全部丢失。

  

        排除可能会使应用非正常中止的错误。

        应当注意尽可能避免用户无意录入无效的数据。

        采用相关控件限制用户输入值的种类。

        当用户作出选择的可能性只有两个时, 可以采用单选框。

        当选择的可能再多一些时,可以采用复选框,每一种选择都是有效的,用户不可能输入任何一种无效的选择。

        当选项特别多时,可以采用列表框,下拉式列表框。

        在一个应用系统中,开发者应当避免用户作出未经授权或没有意义的操作。

        对可能引起致命错误或系统出错的输入字符或动作要加限制、屏蔽和处理。

        对可能发生严重后果的操作要有补救措施。通过补救措施用户可以回到原来的正确状态。

        对一些特殊符号的输入、与系统使用的符号相冲突的字符等进行判断并阻止用户输入该字符。

        对错误操作最好支持可逆性处理,如取消系列*作。

        在输入有效性字符之前应该阻止用户进行只有输入之后才可进行的*作。

        对可能造成等待时间较长的操作应该提供取消功能。

        与系统采用的保留字符冲突的要加以限制。

        在读入用户所输入的信息时,根据需要选择是否去掉前后空格。  

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

2007-07-25,星期三 | 分类:未分类 | 115 views

影响共享软件发展的因素很多,被非法破解可以说是共享软件的头号大敌。那么造成共享软件生存困难的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平台下。

  好了,共享软件的十大杀手为您介绍完了,如何对付它们就是您的事了。需要说明的一点是,以上提到的软件都是“正当”软件,只是在不同的使用者手中发挥了不同的用途。就犹如一把枪,在人民军队手中就是保家卫国的武器,在为非作歹的坏人手中就是一把凶器了,千万不能此就对这些软件产生成见哦!

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

2007-07-25,星期三 | 分类:编 程|VisualBasic | 141 views

‘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 lpDatabaseName As String, ByVal dwDesiredAccess As Long) As Long

Private Declare Function CloseServiceHandle Lib “advapi32.dll” (ByVal hSCObject _
                           As Long) As Long

‘OpenService获取服务程序的句柄

‘参数:
‘hSCManager :服务控制管理程序微服的登记数据库的句柄。由函数 OpenSCManager function 返回 这个句柄。
‘lpServiceName :将要打开的以NULL 结尾的服务程序的名字,和 CreateService   中的 lpServiceName 相对应。
‘dwDesiredAccess :指定服务的访问类型。服务响应请求时,首先检查访问类型。
‘用CreateService 或OpenService 打开的服务程序句柄使用完毕后必须用CloseServiceHandle 关闭。
‘OpenSCManager打开的服务管理数据库句柄也必须用它来关闭。
Private Declare Function OpenService Lib “advapi32.dll” Alias “OpenServiceA” _
                           (ByVal hSCManager As Long, ByVal lpServiceName As String, _
                           ByVal dwDesiredAccess As Long) As Long

‘StartService用来启动服务

‘参数hService为指向Service的句柄,由OpenService返回。
‘dwNumSe-rviceAr为启动服务所需的参数的个数。
‘lpszServiceArgs为启动服务所需的参数
‘函数执行成功返回True
Private Declare Function StartService Lib “advapi32.dll” Alias “StartServiceA” _
                           (ByVal hService As Long, ByVal dwNumServiceArgs As Long, _
                           ByVal lpServiceArgVectors As Long) As Long

Private Declare Function ControlService Lib “advapi32.dll” (ByVal hService As _
                           Long, ByVal dwControl As Long, lpServiceStatus As SERVICE_STATUS) As Long

Const GENERIC_EXECUTE = &H20000000     ‘如果是可执行的,则允许执行
Const SERVICE_CONTROL_STOP = 1         ‘停止服务
Const SERVICE_CONTROL_PAUSE = 2        ‘暂停服务
Const SERVICE_CONTROL_CONTINUE = 3     ‘继续服务

‘*************************************************************************
‘**函 数 名: ServiceCommand
‘**输     入: ByVal ServiceName(String) -
‘** 参    数: COMMAND 可以是   0=Start, 1=Stop, 2=Pause, 3=Continue   -
‘**输     出: 返回真执行成功,否则失败
‘**功能描述: 启动/停止/暂停/继续一个服务
‘**说明:      SERVICENAME必须是服务名称而不是显示名称
‘**调用模块:
‘**作     者: Mr.David
‘**日     期: 2007-06-15 09:15:25
‘**修 改 人:
‘**日     期:
‘**版     本: V1.0.0
‘*************************************************************************
Public Function ServiceCommand(ByVal ServiceName As String, ByVal command As Long) As _
                                Boolean

     Dim hSCM As Long
     Dim hService As Long
     Dim res As Long
     Dim lpServiceStatus As SERVICE_STATUS

     ‘首先检查参数
     If command < 0 Or command > 3 Then Err.Raise 5

     ‘获得一台特定主机的服务控制管理器数据库的句柄
     hSCM = OpenSCManager(vbNullString, vbNullString, GENERIC_EXECUTE)
     If hSCM = 0 Then Exit Function

     ‘打开需要开放的服务,如果打开失败则退出
     hService = OpenService(hSCM, ServiceName, GENERIC_EXECUTE)
     If hService = 0 Then GoTo CleanUp

     Select Case command

         ‘打开服务
         Case 0

         res = StartService(hService, 0, 0)

         Case SERVICE_CONTROL_STOP, SERVICE_CONTROL_PAUSE, _
              SERVICE_CONTROL_CONTINUE

         res = ControlService(hService, command, lpServiceStatus)
         Debug.Print res

     End Select

     If res = 0 Then GoTo CleanUp

     ‘执行成功
     ServiceCommand = True

CleanUp:

     ‘关闭服务句柄
     If hService Then CloseServiceHandle hService
     CloseServiceHandle hSCM

End Function

Private Sub cmdStart_Click()

     ServiceCommand “r_server”, 0
     Me.Hide
     MsgBox “服务已开启,”, vbInformation, “温馨提示”
     Unload Me

End Sub

Private Sub cmdStop_Click()

     ServiceCommand “r_server”, SERVICE_CONTROL_STOP
     Me.Hide
     MsgBox “服务已关闭,”, vbInformation, “温馨提示”
     Unload Me

End Sub

‘WMI属于封装,了解即可
Option Explicit

Dim services As SWbemServices
Public Locator As SWbemLocator

Private Sub StartServices(ServiceName As String)

     Dim ServiceObject As SWbemObject

     Set Locator = New SWbemLocator
     Set services = Locator.ConnectServer(”.”)

     Set ServiceObject = services.Get(”Win32_Service=’” & ServiceName & “‘”)
     Call ServiceObject.StartService

End Sub

Private Sub StopServices(ServiceName As String)

     Dim ServiceObject As SWbemObject

     Set Locator = New SWbemLocator
     Set services = Locator.ConnectServer(”.”)

     Set ServiceObject = services.Get(”Win32_Service=’” & ServiceName & “‘”)
     Call ServiceObject.StopService

End Sub

Private Sub cmdStart_Click()

     Call StartServices(”r_server”)    ‘注意服务名的输入
     Me.Hide
     MsgBox “服务已开启,”, vbInformation, “温馨提示”
     Unload Me

End Sub

Private Sub cmdStop_Click()

     Call StopServices(”r_server”)    ‘注意服务名的输入
     Me.Hide
     MsgBox “服务已关闭,”, vbInformation, “温馨提示”
     Unload Me

End Sub

‘NET

Option Explicit

Private Sub cmdStart_Click()

     Me.Hide
     Shell (”cmd.exe /c net start r_server”), vbHide
     MsgBox “服务已开启,”, vbInformation, “温馨提示”
     Unload Me

End Sub

Private Sub cmdStop_Click()

     Me.Hide
     Shell (”cmd.exe /c net stop r_server”), vbHide
     MsgBox “服务已关闭,”, vbInformation, “温馨提示”
     Unload Me

End Sub

Full source of Service Program

2007-07-25,星期三 | 分类:编 程|VisualBasic | 128 views

‘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 &#38306;&#25968;
     ‘————————————————————————
     Private Declare Function CreateThread Lib “kernel32″ (ByVal lpThreadAttributes As Long, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
     Private Declare Function GetVersionEx Lib “kernel32″ Alias “GetVersionExA” (lpVersionInformation As OSVERSIONINFO) As Long
     Private Declare Function MessageBox Lib “user32″ Alias “MessageBoxA” (ByVal hWnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long

     Private Type OSVERSIONINFO
         dwOSVersionInfoSize As Long
         dwMajorVersion As Long
         dwMinorVersion As Long
         dwBuildNumber As Long
         dwPlatformId As Long
         szCSDVersion(1 To 128) As Byte                                       ‘Maintenance string for PSS usage
     End Type
    
     Private Const VER_PLATFORM_WIN32_NT = 2&
     Private Const INFINITE = -1&                                             ‘Infinite timeout
     Private Const WAIT_TIMEOUT = 258&
     Private ServiceStatus        As SERVICE_STATUS
     Private hServiceStatus       As Long
   
     Dim hStopEvent               As Long
     Dim hStartEvent              As Long
     Dim hStopPendingEvent
     Dim IsNT                     As Boolean
     Dim IsNTService              As Boolean
     Dim ServiceName()            As Byte
     Dim ServiceNamePtr           As Long

     ‘Service Name
     Private Const Service_Name   As String = “My Testing Service”
‘******************************************************************************
Public Sub fnSERVICE()
     On Error GoTo LOCALERRORHANDLER
    
     ‘ ===== SERVICE WILL START FROM HERE =====
    
     Dim hnd         As Long
     Dim h(0 To 1)   As Long
    
     ‘ Only one instance
     If App.PrevInstance Then Exit Sub
    
     ‘ Check OS type
     IsNT = CheckIsNT()
    
     ‘ Creating events
     hStopEvent = CreateEvent(0, 1, 0, vbNullString)
     hStopPendingEvent = CreateEvent(0, 1, 0, vbNullString)
     hStartEvent = CreateEvent(0, 1, 0, vbNullString)
     ServiceName = StrConv(Service_Name, vbFromUnicode)
     ServiceNamePtr = VarPtr(ServiceName(LBound(ServiceName)))
    
     If IsNT Then
        
         ‘Trying to start service
         hnd = StartAsService
         h(0) = hnd
         h(1) = hStartEvent
        
         ‘Waiting for one of two events: sucsessful service start (1) or Terminaton of service thread (0)
        
         IsNTService = WaitForMultipleObjects(2&, h(0), 0&, INFINITE) = 1&
        
         If Not IsNTService Then
             CloseHandle hnd
             MessageBox “Service program must be started as a service.”,”Service”
         End If
    
     Else
        
        MessageBox “Service program is only for Windows NT/2000/XP.”,”Service”
    
     End If
    
‘****************************************************************************************************************
    
     If IsNTService Then
        
         SetServiceState SERVICE_RUNNING

         ‘   ———   From Here Service Will Run   ———-
        
         Do
        
             ‘———————————————————
             ‘From Here What ever code writes will File in the Service Program
             ‘———————————————————

‘Please write your Code to Fire as Service
MessageBox “Service is Running”,”Service”            

             ‘———————————————————
             ‘Sleep for given amount of minutes (60000 = 1 Minute)
             ‘You can Increase / Decrease
             ‘———————————————————
          
         Loop While WaitForSingleObject(hStopPendingEvent, 60000) = WAIT_TIMEOUT
        
         ‘ Here you may stop and destroy service’s objects
         SetServiceState SERVICE_STOPPED
        
         SetEvent hStopEvent
        
         ‘ Waiting for service thread termination
         WaitForSingleObject hnd, INFINITE
         CloseHandle hnd
    
     End If
    
     CloseHandle hStopEvent
     CloseHandle hStartEvent
     CloseHandle hStopPendingEvent
    
     ‘To Write message to Log File
    MessageBox “Service has Stopped”,”Service”
    
     Exit Sub
LOCALERRORHANDLER:
     Call fnERRLOG(”Error Occured:” & Err.Number & “:” & Err.Description)
End Sub
‘******************************************************************************
‘ CheckIsNT() returns True, if the program runs
‘ under Windows NT or Windows 2000, and False
‘ otherwise.
Private Function CheckIsNT() As Boolean
     Dim OSVer As OSVERSIONINFO
     OSVer.dwOSVersionInfoSize = LenB(OSVer)
     GetVersionEx OSVer
     CheckIsNT = OSVer.dwPlatformId = VER_PLATFORM_WIN32_NT
End Function
‘******************************************************************************
‘ The FncPtr function returns function pointer.
Private Function FncPtr(ByVal fnp As Long) As Long
     FncPtr = fnp
End Function
‘******************************************************************************
‘ The StartAsService function creates Service Dispatcher thread.
Private Function StartAsService() As Long
     Dim ThreadId As Long
     StartAsService = CreateThread(0&, 0&, AddressOf ServiceThread, 0&, 0&, ThreadId)
End Function
‘******************************************************************************
‘ The ServiceThread sub starts the service.
‘ This sub returns control only after service termination.
Private Sub ServiceThread(ByVal dummy As Long)
     Dim ServiceTableEntry As SERVICE_TABLE
     ServiceTableEntry.lpServiceName = ServiceNamePtr
     ServiceTableEntry.lpServiceProc = FncPtr(AddressOf ServiceMain)
     StartServiceCtrlDispatcher ServiceTableEntry
End Sub
‘******************************************************************************
‘ The ServiceMain sub - main service sub.
‘ It initializes service,
‘ sets event hStartEvent, and waits hStopEvent event.
‘ When hStopEvent fires, this sub exits and service stops.
Private Sub ServiceMain(ByVal dwArgc As Long, ByVal lpszArgv As Long)
     ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS
     ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP _
                                     Or SERVICE_ACCEPT_SHUTDOWN
     ServiceStatus.dwWin32ExitCode = 0&
     ServiceStatus.dwServiceSpecificExitCode = 0&
     ServiceStatus.dwCheckPoint = 0&
     ServiceStatus.dwWaitHint = 0&
     hServiceStatus = RegisterServiceCtrlHandler(Service_Name, _
                            AddressOf Handler)
     SetServiceState SERVICE_START_PENDING
     ‘ Set hStartEvent. It unlocks main application thread
     ‘ which allows to do some work in it
     SetEvent hStartEvent
     ‘ Wait until hStopEvent fires
     WaitForSingleObject hStopEvent, INFINITE
End Sub
‘******************************************************************************
‘ The Handler sub processes commands from Service Dispatcher.
‘ It sets event hStopEvent when processes command
‘ SERVICE_CONTROL_STOP or SERVICE_CONTROL_SHUTDOWN.
Private Sub Handler(ByVal fdwControl As Long)
     Select Case fdwControl
         Case SERVICE_CONTROL_SHUTDOWN, SERVICE_CONTROL_STOP
             SetServiceState SERVICE_STOP_PENDING
             SetEvent hStopPendingEvent
         Case Else
             SetServiceState
     End Select
End Sub
‘******************************************************************************
‘ The SetServiceState sub changes service state.
‘ If parameter omitted, it confirms previous state.
Private Sub SetServiceState(Optional ByVal NewState As SERVICE_STATE = 0&)
     If NewState <> 0& Then ServiceStatus.dwCurrentState = NewState
     SetServiceStatus hServiceStatus, ServiceStatus
End Sub
‘******************************************************************************

几个实用的模块化代码

2007-07-24,星期二 | 分类:编 程|VisualBasic | 123 views

=========================================================
‘判断文件是否存在
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, ByVal nSize As Long) As Long

Function SysPath() As String
SysPath = String(145, Chr(0))
SysPath = Left(SysPath, GetSystemDirectory(SysPath, 145)) & "\"
End Function

‘获取Window路径(WINDOWS系统目录)
Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Function WinPath() As String
WinPath = String(145, Chr(0))
WinPath = Left(WinPath, GetWindowsDirectory(WinPath, 145)) & "\"
End Function

‘字符串替换(使用方法:输出=ModifyString(欲处理的字符串,原字符,替换字符),例如 strOut=ModifyString(strSource,"hello","你好"),表示把strSource变量里的“hello”替换为“你好”)
Public Function ModifyString(strModString As String, strSrc As String, sgnModify As Variant)
On Error Resume Next
If strSrc <> sgnModify Then
While InStr(strModString, strSrc) <> 0
strModString = Left(strModString, InStr(strModString, strSrc) - 1) & sgnModify & Mid(strModString, InStr(strModString, strSrc) + Len(strSrc))
Wend
End If
ModifyString = strModString
End Function
=========================================================

AVPhone 的一些说明

2007-07-24,星期二 | 分类:编 程|VisualBasic | 121 views

目前还没有在 .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,在被打开之后必须要有 License 消息解锁才能工作,你可以在 DriverOpened 事件中使用 VidCap.SendMessage 来传递这些消息。
压缩速率:VidCap1.Rate,1-30。
捕获的格式:VidCap1.DeviceFormat。此属性为一 Byte 数组,包含了视频格式。或者直接调用

VidCap.Format 由用户自由选择。
压缩质量:Quality,0-100。
缩放比例:ZoomFactor,1 或 2 或 3 或 4 倍原始大小。
视频源及显示选择:调用 SourceDlg 或者 DisplayDlg。
每当图象尺寸改变,VidCap 将产生 Resize 事件。
每当控件被点击是会产生 Click 事件。

2:VidRnd,用于压缩视频的回放。
第一步:调用 VidRnd.StartDecompress 开始解压视频数据。其中参数 BitmapFormat 是压缩视频的格式,你

可以从另外的 VidCap 控件或 AVIFile 控件的 BitmapFormat 属性得到(或通过网络传输得到)。

第二步:每当有新的视频数据,就由 VidRnd.Frame Data 写入控件,控件会自动缓冲及解压并显示。每当缓冲

区的数据被显示完,BufferEmpty 事件将会产生,你可以在此写入新的视频数据到 VidRnd。

第三步:本步骤是可选的。
VidRnd 拥有和 VidCap 相似的 Rate 及 ZoomFactor 属性,SendMessage 方法和 Resize及Click事件

3:Audio,用于音频的捕获、压缩及回放。
第一步:Audio.CapConnect 连接音频设备。你可以由参数 Driver 指定一个设备索引或连接到缺省设备。参数

Format 指定压缩格式,缺省时使用 GSM610 格式,你可以通过选择不同的 Format 来指定任何 ACM 压缩格式

。你也可以调用 Audio.CompressorDlg 由用户自由选择。

第二步,调用 StartCapture 方法后,Audio 立即开始捕获视频,每当捕获并压缩一帧图象,就会有 Frame 事

件产生,其中参数 Data 为一 Byte 数组包含了音频数据。你可以在此操纵 Data 存盘或由传输通路例如

Winsock 发送到远端。Audio.WaveFormat 为一 Byte 数组中包含了压缩音频的格式。

第三步,如果你还要回放音频,你可以调用 Audio.FeedConnect 方法,其中参数 Wft 是压缩音频的格式,你

可以从另外的 Audio 控件或 AVIFile 控件的 WaveFormat 属性得到(或通过网络传输得到)。

第四步:每当有新的音频数据,就由 Audio.Frame Data 写入控件,控件会自动缓冲及解压并重放。每当缓冲

区的数据被显示完,BufferEmpty 事件将会产生,你可以在此写入新的视频数据到 Audio。

4:AVIFile,用于与 AVI 格式文件交换数据。
第一步:如果你要捕获并压缩视频及音频到 AVI 文件,你可以在 VidCap 及 Audio 开始工作后调用

AVIFile.Create “文件名”,VidCap.BitmapFormat, Audio.WaveFormat 方法,然后在每一个 VidCap 或 Audio

的 Frame 事件中把数据 Data 通过 AVIFile.WriteVideo 和 AVIFile.WriteAudio 存盘。

第二步:如果你要回放已压缩的 AVI 文件,你可以调用 AVIFile.OpenA “文件名” 后把VIFile.BitmapFormat

和 AVIFile.WaveFormat 传递到 VidRnd.StartDecompress 或 Audio.FeedConnect,并在使用 ReadAudio 和

ReadVideo 方法读取数据并由控件的 Frame 方法写入到控件进行回放,以后可以在控件的 BufferEmpty 事件

中继续读取 AVI 文件的数据并写入到控件。

下面这几行 VB 源代码演示了在同一台机器上进行视频及音频捕获、压缩及回放的最简代码。(HelloWorld 的完整源程序)

Private Sub Audio1_Frame(Data As Variant)
     Audio1.Frame Data
End Sub

Private Sub VidCap1_Frame(Data As Variant)
     VidRnd1.Frame Data
End Sub

Private Sub Form_Load()
    
     On Error GoTo ErrorHandle
    
     Audio1.CapConnect
     Audio1.StartCapture
    
     Audio1.FeedConnect Audio1.WaveFormat
    
     VidCap1.Connect
     VidCap1.StartCapture
    
     VidRnd1.StartDecompress VidCap1.BitmapFormat
     Exit Sub
    
ErrorHandle:
     MsgBox Err.Description, vbCritical
End Sub

来源:CSDN

36字诀让你受用一生

2007-07-19,星期四 | 分类:人力资源|项目管理 | 105 views

在网上偶然看到这篇帖子,觉得很受用,特摘抄下来,时刻警醒自己。

         一个人不管有多聪明,多能干,背景条件有多好,如果不懂得如何去做人、做事,那么他最终的结局肯定是失败。

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

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

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

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

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

  一、社会交往字诀

  ――教你建功立业

  (一)“谦”字诀

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

  1、不可目中无人

  2、得意不要忘形

  3、有本事不必自夸

  4、请教不择人

  (二)“淡”字诀

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

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

  1、君子之交淡如水

  2、淡看人生,善待生命

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

  4、减少心欲,满足心灵

  (三)“俭”字诀

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

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

  1、从节省生活费开始

  2、“穷大方”不可取

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

  4、欲路勿染,俭以养德

  (四)“自”字诀

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

  男儿立世,自己拍板!

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

  2、独品人生百态

  3、用自我来挑战权威

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

  (五)“礼”字诀

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

  1、以礼待人

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

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

  (六)“正”字诀

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

  1、己所不欲,勿施于人

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

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

  二、形象塑造字诀

  ――教你品格高雅

(七)“志”字诀

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

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

  1、度德量力,以志立身

  2、先立志,有志就有希望

  3、培养成功意识:立志为王

  4、树立偶像,改变自己

  (八)“时”字诀

  做人要惜时,做事要守时。塑造自己的形象,现代人离不开时间观念。合理安排自己的时间,有效利用自己的时间,守时、惜时、不拖延。

  切记:时间就是金钱。

  1、一秒值万金

  2、别漠视业余时间

  3、盗窃他人时间,等于谋财害命

  4、按重要性办事,更能有效利用时间

  (九)“勤”字诀

  多一些努力,便多一些成功的机会。无数事实证明:成功的最短途径是勤奋。不要光耍嘴皮子,不要好逸恶劳,勤字当头,苍天不负有心人,天道酬勤!

  1、成功的最短途径:勤奋

  2、多一些努力,多一些机会

  3、勤于行动,胜于勤说

  (十)“实”字诀

  踏踏实实做人,实实在在办事。任何一个双手插在口袋里的人,都爬不上成功的梯子。给人留下一个实在的形象,给自己的成功增添一份夯实的基础,从实际出发,对自己负责。

  1、敬业,实干家的成功保障

  2、把每一份工作都做好

  3、双手插在口袋里的人,爬不上成功的梯子

  (十一)“专”字诀

  有专才有恒,有恒才有我。

  你生活在一个知识大爆炸的时代,如果你是一个天才,不专心就成了你的不幸;如果你资质平凡,请不要悲观,只要你下定决心一辈子做好一件事,你就能成功。年轻人,千万别给人留下一个朝三暮四的形象。

  1、把所有的鸡蛋放入一个篮子

  2、多才多艺,莫如练就“独门暗器”

  3、专一,让劣势变成优势

  (十二)“慎”字诀

  人生漫长,又短暂,关键的就几步。人性丛林,职场事业,利益多多、诱惑多多。老成不怕多,凡事应多三思,不怕一万,就怕万一。一旦伸错手,入错行,做错事,于名誉,于事业,于形象皆有不救之危。

  “慎”之!

  1、千万别入错行

  2、想好了你再“跳”

  3、不要草率行事

  三、自我提升字诀

  ――教你拯救命运

(十三)“硬”字诀

  做人难,做事难,面对千难万阻,要提升自我,不来点“硬”的怎么行?如果事有勉强,应该敢于说“不”;如果是正当利益,则应当仁不让;甚至,有时还得来点霸王硬上弓,要有“脸皮厚”的时候,也要有“头皮硬”的时候。

  1、拒绝是一门艺术

  2、该我的,就不要客气

  3、怒发冲冠之功

  4、厚脸皮做人,硬头皮做事

  (十四)“小”字诀

  一家海鲜连锁餐厅的老板很可能当初是水产市场练滩儿的,而一家皮鞋连锁店的老板当初可能是擦鞋的。欲做大事,赚大钱,必先做小事,赚小钱,放下架子,舍得小利。从细微处入手,先扫一屋,再扫天下!

  1、一屋不扫,何以扫天下

  2、先做小事,赚小钱

  3、一枚钉子改变一个人的一生

  (十五)“锐”字诀

  小小麻雀,飞飞跳跳、争分夺秒,不停地寻觅食物。人生亦如此,面对残酷竞争,惟有锐意进取,做一个好先锋,把下一个进球当目标,敢于冒险,敢于闯荡,守株待兔的事情毕竟很渺茫。

  1、不以现有成就为满足

  2、锐意追求,绝不退缩

  3、锐气不可抛,成功是迟早

  (十六)“创”字诀

  提升自我,就要有胆有识去超越自我。何谓超越?超越就是吃螃蟹,就是创新。同时创新就意味着冒险,所谓富贵险中求。想人家想不到的,做别人不敢做的,敢为天下先,在于思维的转换。

  1、敢为天下先

  2、打破规则的创意

  3、人弃我取也能创奇迹

  4、逆向思维的攻守之道

  (十七)“通”字诀

  穷则思变,变则通。识时务者为俊杰,通机变者为英豪。通往成功的道路不是一条,又何必在一棵树上吊死呢?抓住成功的关键,东方不亮西方亮,不管它是黑猫白猫,重要的是它能否逮“耗子”。

  1、巧妙地以变应变

  2、条条大道通罗马

  3、成功在于通,有通才有赢

  (十八)“言”字诀

  把赞扬送给别人,就像把食物施舍给饥饿的乞丐一样。古往今来,不知有多少人,凭着三寸不烂之舌,改变了自己平凡的命运。说话幽默,找共同语言……一个“言”字,一生受用。

  1、投其所好找话题

  2、恭维是最好的“润滑剂”

  3、成功人生,幽默机智

  4、“流行语”为你添姿着色

  四、人际互动字诀

  ――教你赢得朋友

(十九)“宽”字诀

  人际互动,应着眼于未来,不念旧恶。原谅别人,是对待自己的最好方式――为你的仇敌而怒火中烧,烧伤的是你自己。做人做事,心胸不可太狭隘。海纳百川,靠一棵宽容的心!

  1、宽恕你的敌人

  2、宽容做人,宽容成事

  3、乐于忘记,不念旧恶

  (二十)“和”字诀

  在人海中,如果我们不想孤立,那么就学会如何与人相处吧!林子大了,什么鸟都有,不要求你喜欢所有的人,但同时世上也没有什么最牛的人。

  和为贵嘛,就要互相留台阶,大家给面子。

  1、为他人着想,为自己铺路

  2、你给别人留面子,别人给你做好事

  3、夫妻之道,亦和亦智

  (二十一)“信”字诀

  有多少人信任你,你就拥有多少次成功的机会,“信”是什么东西?信是一种人格的力量,是超越金钱的友情,是了解、是欣赏、是覆水,具有不可逆转性。所以,言必行,行必果,能帮的忙则帮,但不可轻易许诺!

  1、能帮则帮,不轻易许诺

  2、言而有信,做人讲原则

  3、做事先做人,做人先取信

  4、信誉基石,生死友情

  (二十二)“帮”字诀

  “好风凭借力,送我上青天”。人际交往,互利互惠。帮助别人,就是在为自己的人情信用卡储蓄,特别是在人患难之际施于援手,救落难英雄于困顿。真心助人,其回报不言而喻。

  1、助人发财,自己沾光

  2、好风凭借力,借梯能登天

  3、掌握时机,拉人一把

  (二十三)“敬”字诀

  人要面子树要皮。人存在于社会上,要扮演各种各样角色,特别是在互相的交往中,需要一定的尊严来支撑,这是人性的弱点。明白了这点,才能体会到“敬”字的必要性。

  1、为尊者讳,为上司讳

  2、在失意者面前不谈你的得意

  3、尊敬对方的“闪光点”

  (二十四)“交”字诀

  人情冷暖、世态炎凉,平常朋友平常过。交朋接友,不可急功近利,友情投资,宜走长线,拜拜冷庙,烧烧冷灶,平时多烧香,哪怕是只言片语的问候,亦是交友之道。

  1、闲时多烧香,急时有人帮

  2、友情投资,宜走长线

  3、拜冷庙,烧冷灶,交落难英雄

  五、解困渡厄字诀

  ――教你轻松快乐

(二十五)“坚”字诀

  面对挫折与困难,铭记丘吉尔的名言:“永远,永远,永远不要放弃!”其实世界上并没有什么幸运的事,就是有,也是坚持的结果。为了最后的胜利,应以坚毅不拔之志,面对种种暂时之屈辱,执着追求,不到黄河心不死!

  1、厚积薄发,耐得寂寞

  2、谁笑到最后,谁笑得最甜

  3、执着追求,永不放弃

  4、不到黄河心不死

  (二十六)“谋”字诀

  做人有困惑,做事有困境,面对“山重水复”之关卡,光有坚强的毅志不行,硬闯也不行。解决难题靠的是脑袋,脑袋产生思考,让思考发威,在出人意料之处轻松解决问题。

  1、巧妇能为无米之炊

  2、从“山重水复”到“柳暗花明”

  3、思考的威力

  (二十七)“屈”字诀

  要摆脱人与事的困境,就难免要求人,求人就难免要低三下四,但着眼于未来的成功,即使像蟑螂一样的生活也应在所不惜,风水毕竟轮流转。放下架子,该屈就屈,能屈能伸,以屈为伸方为英雄!

  1、像蟑螂一样生活

  2、放下身段,前方是大道

  3、你敬我一尺,我敬你一丈

  4、低人一级“屈”不死人

  (二十八)“静”字诀

  “不在沉默中爆发,就在沉默中灭亡!”凡遇大事需静气,平心静气是一种境界,一种气度,一种修养。冷静之中的决定往往是摆脱困境的最佳方案,同时冷静也是一种智慧,以静待变,乱中取胜!

  1、把冷板凳坐成经理椅

  2、心宁智生,智生事成

  3、沉着冷静心自怡

  4、沉得住气方为人杰

  (二十九)“乐”字诀

  世上没有绝对幸福的人,只有不肯快乐的心。人生苦短,与其事事张弓拔弩,不如“幽它一默”。记住,成功是从微笑开始的,人生不如意事常***,乐观点,自己营造快乐,学会轻松解决难题。

  1、成功从微笑开始

  2、学会营造快乐

  3、学会轻松愉快地解决难题

  4、世上没有绝对幸福的人,只有不肯快乐的心

  (三十)“靠”字诀

  人生不等不靠,没错,天上不会掉馅饼,守株待兔饿死人,但一点不靠也不行,亲戚朋友、同学、老乡,这是一种“人力资源”,谁人没个三灾六难,能靠则靠,靠不上创造条件也要靠!

  1、让朋友成为你的靠山

  2、出门落难靠老乡

  3、亲戚亲戚,越走越亲

  4、恰同学少年,该靠靠一把

  六、不败人生字诀

  ――教你人生辉煌

  (三十一)“愚”字诀

  学学猫头鹰,睁一只眼,闭一只眼。你说我糊涂,其实我不傻!只是世事多变幻,创业难,败家快,人说水至清则无鱼,人至察则无徒。其实是,明哲保身,大智者往往大愚,聪明者多,能过“愚”字关鲜矣!

  1、糊涂人聪明一世

  2、不要以为自己比别人聪明

  3、处事不要太认真

  4、谁是英雄?

  (三十二)“忍”字诀

  真的英雄,何必气短,善始善终,方为不败!忍能保身,忍能成事,忍是大智,大勇,更是大福!忍是厚,忍是黑,忍小人,忍豪强,忍天下难忍之事,不做性情中人,成常人难成之事。

  1、忍是大智大勇大福

  2、不做性情中人

  3、不败人生,忍者无敌

  (三十三)“退”字诀

  久历江湖,练达人情之人都守一个“退”字。退是一种谋略,退是一种交换,更是一种维系生存的手段。哲人说的好,“不要把痰吐在井里,哪天你口渴的时侯,也要来井边喝水的。”

  1、用心计较般般错,退步思量事事顺

  2、拒绝妥协,就是拒绝成功

  3、惹不起,躲得起

  (三十四)“圆”字诀

  方圆做人,八面玲珑;圆满做事,事事顺心。人心叵测,凡事最好留一手,有闲时,可研究一下“模糊哲学”,人生这套马车,如若安上方方正正的轮子,你没听说过,我也没听说过,寸步难行嘛!

  1、方圆做人,圆满做事

  2、做老二,不要做老大

  3、人情练达即文章,处世圆通慎言语

  (三十五)“危”字诀

  “豪华尽出成功后,逸乐安知与祸双?”历史教训如此,平头百姓亦如此。居家过日,工作职场等都逃不过一个“危”字,人无远虑,必有近忧。

  1、远虑在先,近处无危

  2、郭子仪屏退侍女免祸患

  3、上山下乡当农民――范蠡富贵终身

  (三十六)“装”字诀

  人生在世一台戏,你方唱罢我上场,不管你会不会演,就看你会不会装。充英雄容易,扮弱者难。俗话说得好,枪打出头鸟,不怕贼偷就怕贼惦记着,当你还不具备实力时,请把你过剩的才华藏起来!

  1、故意示弱有好处

  2、用“拟态”和“保护色”

  3、成功需要诈死与佯败

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

2007-07-13,星期五 | 分类:编 程|VisualBasic | 117 views

注:以下方法没有一一测试
一个应用程序不论编制得如何完美,在很多情况下用户还是会对如何使用它提出问题。 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 uCommand As Long, ByVal dwData As Long) As Long   

‘hwndCaller指定调用者的窗口,pszFile指定要调用的文件,uCommand是发送给 HtmlHelp的命令,dwData是uCommand的参数。   

然后在过程中调用:  

private Sub CmdHelp_Click()  

dim i as string  

i = app.path & “\help.chm” ‘用变量i记录与主程序同目录下的help.chm帮助文件  

HtmlHelpA Form1.hWnd, i, 0, 0  

End Sub  

方法五 使用ShellExecute函数:  

先声明如下API:  

Option Explicit  

‘声明API函数用于异步打开一个文档  

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  

Private Const SW_SHOWNORMAL = 1  

然后在过程中调用:  

private Sub CmdHelp_Click()  

dim a as long  

Dim b As String  

b = App.Path & “\help.chm” ‘用变量b记录与主程序同目录下的help.chm帮助文件  

a = ShellExecute (0, “open”, b, “”, “”, SW_SHOWNORMAL)  

End Sub  

方法六

声明HtmlHelp API函数

由于HtmlHelp API 并没有集成在Windows操作系统的API中,因此不能直接调用HtmlHelp.lib 库函数,但HtmlHelp API的功能位于hhctrl.ocx中,这样可以通过调用hhctrl.lib库函数来显示帮助文件,其声明格式如下:

Declare Function Htmlhelp Lib “hhctrl.ocx”Alias “HtmlHelpA”

(ByVal hwndCaller As Long,

ByVal pszFile As String,

ByVal uCommand As Long,

ByVal dwData As Any) As Long

具体参数含义如下:

hwndCaller 调用该函数的窗体句柄

pszFile 帮助文件的名称和位置

uCommand 帮助类型

dwData 与uCommand相匹配的附加参数

定义uCommand 常数

Const HH_DISPLAY_TOPIC = &H0

Const HH_DISPLAY_INDEX=&H2

Const HH_HELP_CONTEXT = &HF

Const HH_DISPLAY_SEARCH= &H3

Const HH_DISPLAY_TEXT_POPUP= &HE

接着指定CHM文件的名称和位置:

App.HelpFile=App.Path & “\Sample.CHM”

程序调用

调用缺省主题帮助

Call HtmlHelp(hwnd,

App.HelpFile,

HH_DISPLAY_TOPIC,

ByVal “Default.htm”)

此调用方式用于没有上下文ID号的情形,dwData可指定一个在CHM文件内的缺省htm文件,也可取NULL,这是HtmlHelp API最基本的一种用法。

调用关键字帮助

Call HtmlHelp(hwnd,

App.HelpFile,

HH_DISPLAY_INDEX,

(DWORD)”关键字”))

此调用方式中dwData取索引文件(.hhk)中存在的关键字。

调用上下文敏感帮助

Call HtmlHelp(hwnd,

App.HelpFile,

HH_HELP_CONTEXT, 1000)

此调用方式用于含有映射信息的CHM文件, dwData取映射表中存在的ID号。

调用全文搜索帮助

Dim Query As HH_FTS_QUERY

Call HtmlHelp(hwnd,

App.HelpFile,

HH_DISPLAY_SEARCH,

(DWORD)& Query)

DwData参数指定一个指向HH_FTS_QUERY结构的指针。

调用弹出式帮助

Dim Popup As HH_POPUP

Call HtmlHelp(hwnd,

NULL,

HH_DISPLAY_TEXT_POPUP,

(DWORD)&Popup)

PszFile通常取NULL,也可以指定一个CHM和一个在该CHM文件中的TEXT文件,DwData用于指定一个指向HH_POPUP结构的指针。

指定显示窗体形式

由于显示帮助文件的缺省窗体是在编译该CHM文件时的窗体,因此为了更好地控制帮助文件的显示,在制作CHM文件时,可以自定义一个窗体形式。在程序中可以通过两种方法来调用自定义窗体。

1.当uCommand 为HH_DISPLAY_TOPIC或HH_HELP_CONTEXT时,在pszFile参数中用“>”符号,其后跟上窗体名称即可。如pszFile取:

App.HelpFile & “> MainWin”

2.用HtmlHelp函数直接指定:

Dim WinType As HH_WINTYPE

Call HtmlHelp(hwnd,

App.HelpFile &” > MainWin”,

HH_SET_WIN_TYPE,

(DWORD) &WinType)

必须声明的是,以上叙述中使用的“Sample.CHM”、“Default.htm”、“关键字”、“1000”和“MainWin”等均属举例,应用中需要根据自己的具体情况来设置这些参数的实际值。

至此,应用程序的帮助系统就建立起来了,当然,要把帮助系统做得更完美一点,还有更多的工作要做。

给程序指定热键

2007-07-08,星期天 | 分类:编 程|VisualBasic | 117 views

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 tInteger
     aint As Integer
     End Type
     Private Type t2Byte
     lByte As Byte
     hByte As Byte
     End Type
     Private ii As tInteger
     Private bb As t2Byte

Private Sub Command1_Click()

End Sub

Private Sub Form_Load()
     Dim wParam As Long, I As Long

     ‘设定ctl-shift-T为该window的hotkey
     bb.hByte = HOTKEYF_CONTROL Or HOTKEYF_SHIFT
     bb.lByte = vbKeyT
     LSet ii = bb

     wParam = CLng(ii.aint)
     I = SendMessage(Me.hWnd, WM_SETHOTKEY, wParam, 0)
     If I = 1 Then
      Debug.Print “Ctl-Shift-T为hotkey”"”
     Else
      If I = 2 Then
      Debug.Print “有其他Window也用Ctl-Shift-T作Hotkey”
      Else
      Debug.Print “指定失败”
      End If
     End If
End Sub

Pages: 1 2 Next