Heute verraten wir Ihnen, wie man eine MessageBox immer im Vordergrund anzeigt, so dass diese nicht von einem anderen Fenster verdeckt werden kann. Zudem zeigen wir, wie sich die MessageBox nach einer frei festlegbaren Zeit wieder schließen lässt, so als hätte der Anwender auf das Schließen-Symbol geklickt. Hierzu müssen wir allerdings auf die MessageBox-Funktion aus dem Windows-API zurückgreifen. Vor dem Aufruf der MessageBox-Funktion wird ein Timer gestartet, über den das Fensterhandle der API-MessageBox ermittelt wird. In Verbindung mit der SetWindowPos-Funktion wird die MessageBox dann "always on top" angezeigt - sofern dies gewünscht ist. Um die MessageBox nach einer bestimmten Zeit autom. schließen zu können, benötigen wir wieder einen Timer, wobei wir dies in ein- und derselben Ereignis-Prozedur erledigen Und damit Sie Ihren bestehenden Code nicht umschreiben müssen, nennen wir unsere neue MessageBox-Funktion MsgBox Die Parameter zum Aufruf der Funktion sind identisch mit denen der VB-MsgBox-Funktion, außer dass es jetzt noch zwei weitere optionale Parameter gibt:
Hinweis: Das autom. Schließen funktioniert allerdings nicht, wenn für "Buttons" das Attribut "vbYesNo" gesetzt ist. In diesem Fall muss der Anwender selbst eine Auswahl treffen. Fügen Sie nachfolgenden Code in ein MODUL: Option Explicit ' Benötigte API's für die Timer-Steuerung Private Declare Function SetTimer Lib "user32" ( _ ByVal hwnd As Long, _ ByVal nIDEvent As Long, _ ByVal uElapse As Long, _ ByVal lpTimer As Long) As Long Private Declare Function KillTimer Lib "user32" ( _ ByVal hwnd As Long, _ ByVal nIDEvent As Long) As Long Private Const MY_NID = 88 Private Const MY_ELAPSE = 25 ' Wartezeit: 25 MSek. ' Benötigte API's für das Manipulieren der MsgBox Private Declare Function MessageBox Lib "user32" _ Alias "MessageBoxA" ( _ ByVal hwnd As Long, _ ByVal lpText As String, _ ByVal lpCaption As String, _ ByVal wType As Long) As Long Private Declare Function GetActiveWindow Lib "user32" () As Long ' WindowHandle des aktiven Fensters Private m_hWnd As Long ' MsgBox OnTop anzeigen Private m_OnTop As Boolean ' Schließen nach x-Millisekunden Private m_Time As Long ' Flag für Timer-Ereignis Private bClose As Boolean ' Benötigte API's für das Anzeigen eines Fenster im Vordergrund Private 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 Private Const HWND_TOPMOST = -1 Private Const HWND_NOTOPMOST = -2 Private Const SWP_NOMOVE = &H2 Private Const SWP_NOSIZE = &H1 ' API für Senden eines Fenster-Commands Private Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" ( _ ByVal hWnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long ' Konstante - Fenster schliessen Private Const WM_CLOSE = &H10 ' Unsere neue MsgBox-Funktion Public Function MsgBox(ByVal sPrompt As String, _ Optional ByVal nButtons As VbMsgBoxStyle = vbOKOnly, _ Optional ByVal sTitle As String = "", _ Optional ByVal sHelpFile As String = "", _ Optional ByVal nContext As Long = 0, _ Optional ByVal nTime As Long = 0, _ Optional ByVal bOnTop As Boolean = False) Dim nResult As Long ' Falls MsgBox "OnTop" angezeigt oder nach ' x Millisekunden geschlossen werden soll... If bOnTop Or nTime > 0 Then ' Fensterhandle bClose = False m_OnTop = True m_hWnd = GetActiveWindow() m_Time = nTime * 1000 ' API-Timer starten nResult = SetTimer(m_hWnd, MY_NID, MY_ELAPSE, AddressOf MsgBox_TimerEvent) ' MsgBox anzeigen nResult = MessageBox(m_hWnd, sPrompt, sTitle, nButtons) ' Timer deaktivieren (falls noch aktiviert) KillTimer m_hWnd, MY_NID Else ' andernfalls Standard-MsgBox anzeigen nResult = VBA.MsgBox(sPrompt, nButtons, sTitle, sHelpFile, nContext) End If ' Rückgabewert MsgBox = nResult End Function ' Timer-Event! Sub MsgBox_TimerEvent() Static nWnd As Long ' API-Timer deaktivieren KillTimer m_hWnd, MY_NID ' MsgBox schließen? If bClose Then SendMessage nWnd, WM_CLOSE, 0&, 0& bClose = False Else ' Fensterhandle der MsgBox nWnd = GetActiveWindow() ' MsgBox On Top setzen If m_OnTop Then SetWindowPos nWnd, HWND_TOPMOST, 0, 0, 0, 0, _ SWP_NOMOVE Or SWP_NOSIZE End If ' Timer neu aktivieren If m_Time > 0 Then bClose = True SetTimer m_hWnd, MY_NID, m_Time, AddressOf MsgBox_TimerEvent End If End If End Sub Der Aufruf erfolgt wie bisher... ' "normale" MsgBox anzeigen MsgBox "Text", vbCritical + vbOKOnly, "Hinweis" ... oder neu: MsgBox "always on top"... ' MsgBox "always on top" MsgBox "Text", vbCritical + vbOKOnly, "Hinweis", , , , True ... oder MsgBox autom. nach 5 Sekunden schließen ' MsgBox nach 5 Sekunden schließen MsgBox "Text", vbCritical + vbOKOnly, "Hinweis", , , 5 Dieser Tipp wurde bereits 49.832 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
Neu! sevCommand 4.0 Professionelle Schaltflächen im modernen Design! Mit nur wenigen Mausklicks statten auch Sie Ihre Anwendungen ab sofort mit grafischen Schaltflächen im modernen Look & Feel aus (WinXP, Office, Vista oder auch Windows 8), inkl. große Symbolbibliothek. Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 Access-Tools Vol.1 Über 400 MByte Inhalt Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |