MessageBox automatisch schliessen
-
Hallo zusammen!
Ich habe ein Problem von dem ich dachte es einfach lösen zu können,
bislang aber keinen Erfolg hatte:Ich will eine nach einem bestimmten Ereigniss ewine zuvor angezeigte
Messagebox automatisch schließen.
Also z.B.Application->MessageBox("ich schliesse bald
automatisch","bla",MB_ICONINFORMATION);
... code der nach ereignis X die Messagebox schließt (sofern noch
vorhanden)Hoffe jemand kann mir helfen - herzlichen Dank im Voraus!
P.s. ich nutze den Borland Builder falls das relevant sein sollte....
-
Das Problem dabei ist das die Funktion MessageBox erst zurückkehrt wenn man sie bestätigt hat.
Die einfachste Lösung wäre wohl einen eigenen MessageDialog zu machen.
-
hmmm, das hatte ich befürchtet.
Danke für die Antwort!
-
Es gibt da die undokumentierte von user32.dll exportierte Funktion MessageBoxTimeout(A/W), bei der man eine Zeit übergeben kann nach der sich die Messagebox automatisch schließt, allerdings nicht eventgesteuert.
#define UNICODE #include <iostream> #include <conio.h> #include <windows.h> typedef int (WINAPI *MessageBoxTimeOutWFunc)(HWND hWndParent,PWCHAR strText,PWCHAR strCaption, UINT uType,WORD wLanguageId,DWORD dwMilliseconds); #define ID_TIMEOUT 32000 int main() { HMODULE hMod = LoadLibrary(L"user32.dll"); MessageBoxTimeOutWFunc pMessageBoxTimeout = (MessageBoxTimeOutWFunc)GetProcAddress(hMod,"MessageBoxTimeoutW"); int ret = pMessageBoxTimeout(NULL,L"Hallo",L"Titel",MB_ICONEXCLAMATION | MB_OKCANCEL | MB_SETFOREGROUND,0,3000); //Die MB_OK-Messagebox liefert immer ID_OK zurück. if (ret == ID_TIMEOUT) { std::wcout << L"Timed out"; } FreeLibrary(hMod); getch(); return 0; }
-
Hört sich eigentlich richtig gut an!
Nur bekomme ich leider eine Fehlermeldung in der ZeileHMODULE hMod = LoadLibrary(L"user32.dll");(Cannot convert wchar_t to const char)
Wenn ich das "L" vor "user32.dll" entferne compiliert er zwar, danach gibts dann aber direkt ne Exeption...
-
Hmm, ja, der Code nutzt den Unicode-Zeichensatz, das mache ich seit neuestem aus Prinzip

Du müsstest aus MessageBoxTimeoutW ein MessageBoxTimeoutA machen, die PWCHARs in PCHARs ändern und die Ls bei den Stringliteralen entfernen.
Ich bitte um Verzeihung für die dadurch entstandenen Umstände
-
und vielleicht auch noch kontrollieren ob die dll überhaupt geladen wurde.
Hier wäre noch ein Beispiel
http://www.codeproject.com/cpp/MessageBoxTimeout.asp
Ich denke aber, dass eine selbst erzeugte MessageBox etwas einfacher wäre.
-
na dann versuche ichs mal mit deinen änderungsvorschlägen!
Ich habe zwischenzeitlich eine andere Methode ausprobiert (die ebenfalls die user32.dll verwendet).Der Code lässt sich zwar kompilieren, aber der enthaltene Aufruf:
MsgBoxTOA = (MSGBOXAAPI)GetProcAddress(hUser32, "MessageBoxTimeoutA");liefert NULL zurück. Ein anschliessendes GetLastError liefert "127". Nachdem was ich bislang gefunden habe heisst das das die Methode nicht gefunden wurde.
Ich nutze Win2K, kann es sein das die user32.dll meines systems nicht damit funktioniert?
Weiterhin habe ich 2 verschiedene user32.dll dateien auf meinem system. eine user32.dll (ältere dateiversion) und eine USER32.dll (neuere Version).Werde jetzt trotzdem nochmal dein Beispiel versuchen...
-
Du kannst ja mit ImpDef in der User32.dll mal nachschauen ob diese Funktion existiert und wenn welche Signatur sie hat.
-
jau, werde das mal versuchen.
Bei deiner Version habe ich nämlich jetzt den selben "fehler".MessageBoxTimeOutWFunc pMessageBoxTimeout = (MessageBoxTimeOutWFunc)GetProcAddress(hMod,"MessageBoxTimeoutW");nach diesem aufruf ist pMessageBoxTimeout immer noch NULL (daher wohl auch die Exception bei meinem ersten versuch)
Ein Aufruf von GetLastErrorMessage liefert hier auch "127"...
-
hmmm...
Hier ein Auszug nach Ausführung von impdef:MessageBoxA @452 ; MessageBoxA
MessageBoxExA @453 ; MessageBoxExA
MessageBoxExW @454 ; MessageBoxExW
MessageBoxIndirectA @455 ; MessageBoxIndirectA
MessageBoxIndirectW @456 ; MessageBoxIndirectW
MessageBoxW @457 ; MessageBoxW
-
Welche Windowsversion hast du denn. Ich hab irgendwo mal gelesen, dass es diese Funktion erst ab XP gibt. Ich hab W2k und da ist sie auch nicht dabei.
-
Tja, dann wird das so nichts unter 2000, deswegen ist sie wohl auch undokumentiert.
-
jou, nutze hier win2k

Und sonst gibt es da keine Möglichkeit?
Ich komme eigentlich aus der "Java-Ecke" und da wäre sowas eigentlich kein Problem ...Trotzdem schonmal Danke an alle für die Hilfe!!!
Nachtrag
SendMessageTimeoutA <-- das finde ich bei der user32.dll, aber das is was anderes oder?
-
Wie gesagt, mach es selbst.
Einfach eine kleine Form erstellen. Die notwendigen Buttons, Labels etc. drauf. Dann im OnShow einen Timer starten und in OnTimer Close() aufrufen. Fertig.
-
ok, werde es so machen, Danke!
-
Guck dir hier mal meine TimedMessagebox an: http://www.luckie-online.de/Developer/Delphi/Sonstiges/ -> TimedMsgBox.zip. Ist zwar Delphi aber das dürfte egal sein.