<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      偵測離開Form進入其他程式

      [摘要]雖然Form有Activate與DeActivate的Events,但是這兩個Events只對form的Focus是在 同一個Process不同Form之間的切換有效,如果我們在Form1,而Cl...
      雖然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


      日韩精品一区二区三区高清