侦测离开Form进入其他程式

王朝厨房·作者佚名  2007-01-04
宽屏版  字体: |||超大  

虽然Form有Activate与DeActivate的Events,但是这两个Events只对form的Focus是在

同一个Process不同Form之间的切换有效,如果我们在Form1,而Click其他的Process,

则Form1并不会产生DeActivate的Events,相同的,由其他的Process 回到Form1时,也

不会产生Activate的Events。唯一能得知的便是透过WM_ACTIVATE,其LowWord of wParam

有以下叁个值:

WA_ACTIVE Activated by some method other than a mouse click

WA_CLICKACTIVE Activated by a mouse click.

WA_INACTIVE Deactivated

透过Subclassing的技巧便可来解决这个问题

’以下在.bas

Option Explicit

Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _

(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _

(ByVal hwnd As Long, ByVal nIndex As Long) As Long

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 GWL_WNDPROC = (-4)

Public Const WM_ACTIVATE = &H6

Public Const WA_ACTIVE = 1

Public Const WA_CLICKACTIVE = 2

Public Const WA_INACTIVE = 0

Public preWinProc As Long

Public Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, _

ByVal wParam As Long, ByVal lParam As Long) As Long

Dim fActive As Integer

If Msg = WM_ACTIVATE Then

’取得wParam的LowWord

fActive = CInt(wParam And &HFFFF)

If fActive = WA_INACTIVE Then

Debug.Print "InActive "

Else

Debug.Print "Active"

End If

End If

’将之送往原来的Window Procedure

wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)

End Function

’以下在form

Option Explicit

Private Sub Form_Activate()

Debug.Print "Event Activate"

End Sub

Private Sub Form_Deactivate()

Debug.Print "Event DeActivate"

End Sub

Private Sub Form_Load()

Dim ret As Long

’记录原本的Window Procedure的位址

preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)

’设定Combo1的window Procedure到wndproc

ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)

End Sub

Private Sub Form_Unload(Cancel As Integer)

Dim ret As Long

’取消Message的截取,而使之又只送往原来的Window Procedure

ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)

End Sub

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有