MsgBox nach fertiggestellter Aufgabe schließen
-
Wieso hat das noch niemand zur WinAPI verschoben?
Sorry.
-
Dieser Thread wurde von Moderator/in Arcoth aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
nwp3 schrieb:
YviXbit schrieb:
welche Message soll ich senden, damit sich das Fenster schließt?
DestroyWindow(m_hwnd);
Wieso hat das noch niemand zur WinAPI verschoben?
hab ich schon probiert. Dieser Code lässt die MsgBox nicht schließen.
-
Hab's jetzt auch mit folgender Message probiert:
SendMessage(mhwnd, BM_CLICK, MK_LBUTTON, NULL);
auch die funktioniert nicht... hat jemand eine Idee?
Vor allem warum DestroyWindow(m_hwnd) auch nicht funktioniert?
-
WM_CLOSE
Bist du dir denn sicher, dass du den richtigen Handle bekommst und nicht den von deiner Konsole, oder welches Fenster auch vor der MessageBox da war?
Wenn das auch nicht funtzt, müsste man sich die Funktion vielleicht mal im Dissassambler ansehen.
-
Nein, funkt auch nicht.
Das hier ist der gesamte Code für ein kurzes Konsolen-Bsp.:
#include <Windows.h> #include <iostream> using namespace std; void main() { HWND m_hwnd; DWORD dwID = 0; MSGBOXPARAMS msg = { 0 }; msg.cbSize = sizeof(MSGBOXPARAMS); msg.hInstance = GetModuleHandle(NULL); msg.lpszText = TEXT("refresh Text-File"); msg.lpszCaption = TEXT("Please wait..."); msg.dwStyle = MB_OK | MB_SETFOREGROUND; CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MessageBoxIndirect, &msg, 0, &dwID); m_hwnd = FindWindow(NULL, NULL); // Handle für MsgBox cout << "Fenster Handle = " << m_hwnd << endl << endl; SendMessage(m_hwnd, WM_CLOSE, NULL, NULL); // MsgBox schließen system("pause"); }
Warum schließt sich die MsgBox nicht?
Läuft das bei euch, wie es sein sollte?p.s.: auch mit DestroyWindow() u.ä. komme ich nicht zum gewünschten Ergebnis...
-
EndDialog(GetForegroundWindow(), IDYES);
Funktioniert.
Allerdings wird FindWindow (aus deinem Beispiel) nicht das richtige Handle returnen. Dein Thread braucht ein wenig um die MessageBox aufzubauen.
-
Ich würde einen Thread erstellen der einen einmalig erzeugten Dialog sichtbar und unsichtbar macht. Warum immer den ganzen Fensterkram neu erstellen?
-
Mr.Long schrieb:
Funktioniert.
Allerdings wird FindWindow (aus deinem Beispiel) nicht das richtige Handle returnen. Dein Thread braucht ein wenig um die MessageBox aufzubauen.Auf Fenster warten!
FindWindow(NULL, NULL);
Findet irgendein Fenster. Ich würde das bekannte Fenster suchen:
HWND m_hwnd=NULL, m_hwnd2=NULL; while(!m_hwnd) { Sleep(0); m_hwnd = FindWindow((LPCWSTR)32770, msg.lpszCaption); m_hwnd2 = FindWindow(NULL, NULL); }
Obwohl nach dem Warten zwei verschiedene Handles herauskommen scheint es
dann egal zu sein welchem Fenter man die Message schickt ?
-
SUPER!
Mit folgendem Code klappt's:
#include <Windows.h> #include <iostream> using namespace std; void main() { DWORD dwID = 0; MSGBOXPARAMS msg = { 0 }; msg.cbSize = sizeof(MSGBOXPARAMS); msg.hInstance = GetModuleHandle(NULL); msg.lpszText = TEXT("refresh Text-File"); msg.lpszCaption = TEXT("Please wait..."); msg.dwStyle = MB_OK | MB_SETFOREGROUND; CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MessageBoxIndirect, &msg, 0, &dwID); HWND m_hwnd = NULL; while (!m_hwnd) { Sleep(0); m_hwnd = FindWindow((LPCSTR)32770, msg.lpszCaption); } cout << "Fenster Handle = " << m_hwnd << endl << endl; SendMessage(m_hwnd, WM_CLOSE, NULL, NULL); // MsgBox schließen system("pause"); }
Vielen Dank!