Option Explicit
'API deklarationen
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 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 UnhookWindowsHookEx Lib user32 _
(ByVal hHook As Long) As Long
Public Declare Function GetCurrentThreadId Lib kernel32 () As Long
'deklaration der constanten
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
'deklaration der variablen
Public hHook As Long
Public posX As Long
Public posY As Long
'funktion zur positionierung
Public Function WinProc(ByVal lMsg As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long
If lMsg = HCBT_ACTIVATE Then
SetWindowPos wParam, 0, posX, posY, 0, 0, SWP_NOSIZE Or _
SWP_NOZORDER Or SWP_NOACTIVATE
UnhookWindowsHookEx hHook
End If
WinProc = False
End Function
'hauptfunktion
Public Function MyMsgBox(ByVal message As String, Optional msgBtn _
As VbMsgBoxStyle = vbOKOnly, Optional msgTitle As Variant = , _
Optional msgHelp As Variant = 0, Optional msgContext As Variant _
= 0, Optional ByVal txtPosX As Variant = , Optional ByVal _
txtPosY As Variant = ) As VbMsgBoxResult
If txtPosX <> And txtPosY <> Then
Dim hInst As Long, Thread As Long
Dim msg As String
hInst = App.hInstance
Thread = GetCurrentThreadId()
hHook = SetWindowsHookEx(WH_CBT, AddressOf WinProc, _
hInst, Thread)
posX = CLng(txtPosX)
posY = CLng(txtPosY)
End If
msg$ = message
MyMsgBox = MsgBox(msg$, msgBtn, msgTitle, msgHelp, msgContext)
End Function