VB中LostFocus、GotFocus事件的改进

小歆12年前软件源码02935
---- VB中有一个LostFocus事件和一个GotFocus事件,看名字似乎是当当前窗口失去焦点或得到焦点时触发的事件。但在实际应用时却发现当这个窗口和Windows中其他窗口进行切换时并没有触发这两个事件。现在解析一下这两个事件。 

---- Form_LostFocus、Form_GotFocus是指的是一个MDI主父窗体调用了多个子窗体,当这些子窗体之间切换时,就触发这两个事件;当一个窗体中的多个文本框,鼠标点击另一个文本框时,也会触发这两个此事件,文本框在 Windows内部实际上也是一个窗口。 

---- Windows内部是通过消息来触发事件的,这两个事件在Windows内部对应的消息是WM_NCACTIVATE,当该消息的wParam为0时表示是失去焦点,为非0时表示得到焦点。


在模块中: 

Public Declare Function SetWindowLong Lib 
"user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, 
ByVal dwNewLong As Long) As Long 

Public Declare Function DefWindowProc Lib 
"user32" Alias "DefWindowProcA"_
(ByVal hwnd As Long, ByVal wMsg As Long,
ByVal wParam As Integer, ByVal_
lParam As Long) As Long 

Public Declare Function CallWindowProc Lib
"user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, 
ByVal Msg As Long, ByVal _
wParam As Long, ByVal lParam As Long) As Long 

Public Const WM_NCACTIVATE = &H86 
Public Const GWL_WNDPROC = (-4) 
Public OldWndProc& 

Public Function Hook&(ByVal hWnd1&) 
    OldWndProc = SetWindowLong(hWnd1,
GWL_WNDPROC, AddressOf NewWndProc) 
Hook = OldWndProc 
End Function 

Public Sub UnHook(ByVal hWnd1&) 
    SetWindowLong hWnd1, GWL_WNDPROC, OldWndProc 
End Sub 

Public Function NewWndProc&(ByVal hWnd1&, ByVal uMsg&,
ByVal wParam&, ByVal lParam&) 
    If uMsg = WM_NCACTIVATE Then 
    If wParam = 0 Then ’失去焦点
    Form1.Caption = "失去焦点" 
'在这里加入在失去焦点时想要执行的代码
    Else
Form1.Caption = "得到焦点"    
’在这里加入在得到焦点时想要执行的代码
    End If 
    End If 
    NewWndProc = CallWindowProc(OldWndProc, 
hWnd1, uMsg, wParam, lParam) 
End Function 

窗口中代码如下: 

Private Sub Form_Load() 
    Hook Form1.hwnd 
End Sub 

Private Sub Form_QueryUnload(Cancel As Integer,
UnloadMode As Integer) 
    UnHook Form1.hwnd 
End Sub 

---- 注意:在编写“失去焦点”和“得到焦点”的代码时,不要使用VB本身自带的函数,如: MsgBox()和Print()等,因为这里不支持,要用MessageBox()、TextOut()等API函数来代替,否则VB会出现“非法保护性错误”而把VB连带程序一起关掉。

相关文章

【VB源码】LOL昵称查询QQ号工具V1.0

【VB源码】LOL昵称查询QQ号工具V1.0

名称:LOL昵称查询QQ号工具V1.0 作者:小歆 说明:通过腾讯的游戏人生来获取的... 源码下载: 【VB源码】LOL昵称查询QQ号工具.rar 程序下载...

STM32学习方法建议

对于STM32的ARM处理器对很多学子们是个崭新的东西。 学习时,要注意一些方法: 1.不能像51一样依靠教科书学习,目前外面卖的STM32相关书籍,都是对STM32的数据手册的翻译和照抄...

LT3083:降压DC-DC解决方案电路图

LT3083:降压DC-DC解决方案电路图

LT3083 是一款3A 低压差线性稳压器,可通过并联来增加输出电流或在表面贴装型电路板上散播热量。这款新型稳压器专为用作一个精准电流源和电压跟随器而设计,可在许多要求高电流、至零的可调节能力和不设...

APK编辑工具(编译 and 反编译)绿色中文版

APK编辑工具(编译 and 反编译)绿色中文版

软件简介 apktool是apk反编译工具能够反编译及回编译apk,同时安装反编译系统apk所需要的framework-res框架,清理上次反编译文件夹等功能。 使用方法...

VB格式输出函数Format的使用

VB格式输出函数可以使数值、日期或字符串按指定的格式输出。其格式为: Format(<表达式>[, <格式字符串>])...

PCB工程英文单词

单词 附件:attached 样品:sample 承认:approval 答复:answer;reply 规格:...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。