如何將 MsgBox,使用 Windows 的勾點程序

文章翻譯 文章翻譯
文章編號: 180936 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

本文說明如何將放置在螢幕上的訊息方塊。

其他相關資訊

您可以為您的應用程式建立 CBT 勾點,如此時建立和終結視窗,它會接收通知。如果就地顯示訊息方塊與此 CBT 勾點,您的應用程式會收到 HCBT_ACTIVATE 訊息,當啟動訊息方塊。一旦您會收到此 HCBT_ACTIVATE 訊息,您可以使用 SetWindowPos API 函數將視窗定位,然後再放開 CBT 攔截,如果不再需要。

雖說是逐步範例

  1. 啟動新的標準 EXE 專案。預設會建立 Form1。
  2. 將模組加入至專案,並將下列程式碼加入至新的模組:
          Type RECT
             Left As Long
             Top As Long
             Right As Long
             Bottom As Long
          End Type
    
          Public Declare Function UnhookWindowsHookEx Lib "user32" ( _
             ByVal hHook As Long) As Long
          Public Declare Function GetWindowLong Lib "user32" Alias _
             "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) _
             As Long
          Public Declare Function GetCurrentThreadId Lib "kernel32" () As Long
          Public Declare Function SetWindowsHookEx Lib "user32" Alias _
             "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, _
             ByVal hmod As Long, ByVal dwThreadId As Long) As Long
          Public Declare Function SetWindowPos Lib "user32" ( _
             ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
             ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
             ByVal cy As Long, ByVal wFlags As Long) As Long
          Public Declare Function GetWindowRect Lib "user32" (ByVal hwnd _
             As Long, lpRect As RECT) As Long
    
          Public Const GWL_HINSTANCE = (-6)
          Public Const SWP_NOSIZE = &H1
          Public Const SWP_NOZORDER = &H4
          Public Const SWP_NOACTIVATE = &H10
          Public Const HCBT_ACTIVATE = 5
          Public Const WH_CBT = 5
    
          Public hHook As Long
    
          Function WinProc1(ByVal lMsg As Long, ByVal wParam As Long, _
             ByVal lParam As Long) As Long
    
             If lMsg = HCBT_ACTIVATE Then
                'Show the MsgBox at a fixed location (0,0)
                SetWindowPos wParam, 0, 0, 0, 0, 0, _
                             SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOACTIVATE
                'Release the CBT hook
                UnhookWindowsHookEx hHook
             End If
             WinProc1 = False
    
          End Function
    
          Function WinProc2(ByVal lMsg As Long, ByVal wParam As Long, _
             ByVal lParam As Long) As Long
    
          Dim rectForm As RECT, rectMsg As RECT
          Dim x As Long, y As Long
    
             'On HCBT_ACTIVATE, show the MsgBox centered over Form1
             If lMsg = HCBT_ACTIVATE Then
                'Get the coordinates of the form and the message box so that
                'you can determine where the center of the form is located
                GetWindowRect Form1.hwnd, rectForm
                GetWindowRect wParam, rectMsg
                x = (rectForm.Left + (rectForm.Right - rectForm.Left) / 2) - _
                    ((rectMsg.Right - rectMsg.Left) / 2)
                y = (rectForm.Top + (rectForm.Bottom - rectForm.Top) / 2) - _
                    ((rectMsg.Bottom - rectMsg.Top) / 2)
                'Position the msgbox
                SetWindowPos wParam, 0, x, y, 0, 0, _
                             SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOACTIVATE
                'Release the CBT hook
                UnhookWindowsHookEx hHook
             End If
             WinProc2 = False
    
          End Function
    
    						
  3. 將兩個 CommandButtons 加入至 Form1。
  4. 將下列程式碼加入至 Form1:
          Private Sub Command1_Click()
          Dim hInst As Long
          Dim Thread As Long
    
             'Set up the CBT hook
             hInst = GetWindowLong(Me.hwnd, GWL_HINSTANCE)
             Thread = GetCurrentThreadId()
             hHook = SetWindowsHookEx(WH_CBT, AddressOf WinProc1, hInst, _
                                      Thread)
    
             'Display the message box
             MsgBox "This message box has been positioned at (0,0)."
    
          End Sub
    
          Private Sub Command2_Click()
          Dim hInst As Long
          Dim Thread As Long
    
             'Set up the CBT hook
             hInst = GetWindowLong(Me.hwnd, GWL_HINSTANCE)
             Thread = GetCurrentThreadId()
             hHook = SetWindowsHookEx(WH_CBT, AddressOf WinProc2, hInst, _
                                      Thread)
    
             'Display the message box
             MsgBox "This message box is centered over Form1."
          End Sub
    
    						
  5. 按下 F5 鍵以執行程式。按一下 Command1 及訊息方塊會出現在左上角的螢幕 (0,0)。按一下 [確定] 以關閉訊息方塊。按一下 [Command2 及訊息方塊會出現在 Form1 中心。按一下 [確定] 以關閉訊息方塊。

?考

如需有關使用 Visual Basic 建立訊息攔截程序的詳細資訊,請參閱下列文件 「 Microsoft 知識庫 」 中:
168795: 如何執行視窗的訊息使用 AddressOf 虎

170570: 如何建置 AddressOf VB5 中使用的 Windows 訊息處理程式

屬性

文章編號: 180936 - 上次校閱: 2005年3月11日 - 版次: 2.2
這篇文章中的資訊適用於:
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 6.0 Learning Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
關鍵字:?
kbmt kbhowto KB180936 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:180936
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com