网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Visual Basic
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.用VB6编写强力的windows隐藏引擎.
.怎样在VB5中使用OLEDRAGDROP事件.
.真彩色图像变为256色灰度.
.ADO设定独占性的资料库.
.在你的应用程序里实现简单的加密.
.关于VisualBasic6.0类开发(下).
.自定义指定文件夹的图标.
.PropertyBag对象实现数据连续操作.
.VB中资源文件的具体使用方法.
.用VB进行移位操作.
.避免VisualBasic程序重复执行.
.实现窗体内部的左右移动.
.如何在VB6.0中创建和使用文本资源.
.用VB编写异步多线程下载程序.
.使用VB获取网上邻居里的计算机名.
.VisualBasic设计多媒体应用程序.
.用VB实现程序的隐形.
.利用VBScript实现倒计时.
.如何从SOUND.DRV中提取声音.
.让VisualBasic程序在新UserLogin.

按下某组键(HotKey)便执行某程式

发表日期:2006-2-27


在Dos的年代,我们常会以拦截中断向量的方式,做到按下某个hotkey而自动执行某个程式,在Window呢,也可以,不过它是用RegisterHotkeyAPI来完成。

使用RegisterHotkey的概念是,它会定义一组按键的组合,当使用者不管在哪个程式之中,按下Window有注册的HotKey时,OS会传送WM_HOTKEY的讯息给待接收该讯息的Window,而该Window收到WM_HOTKEY时,便可知道有本身Thread所定义的HotKey被按下,於是可以从wParam,lParam来得知是哪一组HotKey被按下。

RegisterHotKey(
ByValhwndAsLong,//接收Hotkey的Window
ByValidHotKeyasLong,//identifierofhotkey,range0x0000through0xBFFF
ByValModifiersAsLong,//定义altshiftcontrol等的组合
ByValuVirtKeyAsLong//virtual-keycode
)

WM_HOTKEY叁数的定义
idHotKey=wParam;//identifierofhotkey
Modifiers=(UINT)LOWORD(lParam);//key-modifierflags
uVirtKey=(UINT)HIWORD(lParam);//virtual-keycode

所以了,除了设定RegisterHotkey外,另要使用SubClassing的技巧才会得知HotKey被按下;最後,程式结束前要使用UnRegisterHotkey将HotKey的定义取消掉。

以下程式功能是:不管在哪个程式中,只要按下ALT-SHIFT-G便执行NotePad。
'以下在.BasOptionExplicit

DeclareFunctionSetWindowLongLib"user32"Alias"SetWindowLongA"_
(ByValhwndAsLong,ByValnIndexAsLong,ByValdwNewLongAsLong)AsLong
DeclareFunctionGetWindowLongLib"user32"Alias"GetWindowLongA"_
(ByValhwndAsLong,ByValnIndexAsLong)AsLong
DeclareFunctionCallWindowProcLib"user32"Alias"CallWindowProcA"_
(ByVallpPrevWndFuncAsLong,ByValhwndAsLong,ByValMsgAsLong,_
ByValwParamAsLong,ByVallParamAsLong)AsLong
DeclareFunctionRegisterHotKeyLib"user32"(ByValhwndAsLong,ByValidAsLong,ByValfsModifiersAsLong,ByValvkAsLong)AsLong
DeclareFunctionUnregisterHotKeyLib"user32"(ByValhwndAsLong,ByValidAsLong)AsLong

PublicConstWM_HOTKEY=&H312
PublicConstMOD_ALT=&H1
PublicConstMOD_CONTROL=&H2
PublicConstMOD_SHIFT=&H4
PublicConstGWL_WNDPROC=(-4)

PublicpreWinProcAsLong
PublicModifiersAsLong,uVirtKeyAsLong,idHotKeyAsLong

PrivateTypetaLong
llAsLong
EndType

PrivateTypet2Int
lWordAsInteger
hwordAsInteger
EndType

PublicFunctionwndproc(ByValhwndAsLong,ByValMsgAsLong,_
ByValwParamAsLong,ByVallParamAsLong)AsLong
IfMsg=WM_HOTKEYThen
IfwParam=idHotKeyThen
DimlpAstaLong,i2Ast2Int
lp.ll=lParam
LSeti2=lp
If(i2.lWord=Modifiers)Andi2.hword=uVirtKeyThen
Debug.Print"HotKeyShift-Alt-GPressed"
Shell"notepad",vbNormalFocus
EndIf
EndIf
EndIf
'将之送往原来的WindowProcedure
wndproc=CallWindowProc(preWinProc,hwnd,Msg,wParam,lParam)
EndFunction

'以下在Form
SubForm_Load()
DimretAsLong
preWinProc=GetWindowLong(Me.hwnd,GWL_WNDPROC)
ret=SetWindowLong(Me.hwnd,GWL_WNDPROC,AddressOfwndproc)
idHotKey=1'intherange&h0000through&hBFFF
Modifiers=MOD_ALT MOD_SHIFT
uVirtKey=vbKeyG
ret=RegisterHotKey(Me.hwnd,idHotKey,Modifiers,uVirtKey)
EndSub

PrivateSubForm_Unload(CancelAsInteger)
DimretAsLong
'取消Message的截取,而使之又只送往原来的WindowProcedure
ret=SetWindowLong(Me.hwnd,GWL_WNDPROC,preWinProc)
CallUnregisterHotKey(Me.hwnd,uVirtKey)
EndSub->

上一篇:怎样捕捉窗体的鼠标 人气:2156
下一篇:捕捉MouseExit事件 人气:3220
浏览全部Visual Basic的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐