MessageBox schließen

gehrti

Mitglied
Hi!

Gibt es eine Möglichkeit eine MessagBox zu schließen, ohne dass man die bereitgestellten Buttons verwendet? Sie müsste nicht modal geöffnet werden
und sobald die Berechnung im Hintergrund fertig ist und man die MessageBox
noch nicht weggedrückt hat, soll sie geschlossen werden.

MfG. Thomas
 
Hallo

eine Messagebox kann man meiner Meinung nach nicht so einfach schließen, denn man bekommt keinen HANDLE auf das Window.

Ich würde eine normale Dialogbox anzeigen, die ich dann jederzeit wieder schliessen kann.

Anzeige und schließen:

CDialog dlg;
dlg.Create(IDD_DIALOG_TEST);
dlg.ShowWindow(SW_SHOW);
dlg.UpdateWindow();

.....

dlg.DestroyWindow();


Grüße
Kurt
 
Hallo

es gibt doch eine Möglichkeit eine Modale MessageBox von einem Programm aus zu schliessen.
Man sendet einfach der Anwendung eine "Return" Taste, die dann das schließen der Messagebox bewirkt.
Ich habs probiert, und es funkt.

keybd_event(VK_RETURN, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);
keybd_event(VK_RETURN, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);


Grüße
Kurt
 
Guten Tag allerseits,

Da ich vor kurzer Zeit das Problem selber hatte, hier nochmal die Lösung:

Nehmen wir an die Anwendung hat den Namen "TEST".
Der Name in der Titelleiste ist der Name der Anwendung.

Die AfxMessageBox ist ein Kinfendfenster der Anwendung und erhält beim Aufruf den Namen der Anwendung.

HWND FindWindow(
LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);

Sucht nach einem Fenster und gibt die Fenster-ID zurück.

HWND hWnd; //Handle für das Fenster (Ist eigentlich nur eine Fenster-ID)
hWnd = ::FindWindowEx(0,"TEST"); //Handle beschaffen
::postMessage(hWnd,WM_CLOSE,0,0); //WM_CLOSE Nachricht an die MessageBox schicken.

Das wars. Hoffe das hilft.

PS: Benutze die Suchfunktion.
 
Besten Dank!

Mir stellt sich gerade noch die Frage, wie ich die MessageBox nicht modal öffnen kann?

MfG. Thomas
 
Meines Wissens nach ist es nicht möglich eine normale MessageBox wie "AfxMessageBox" oder "CWnd::MessageBox" nicht modal aufzurufen.

Für deine Zwecke wäre ein selbstgebastelter, nicht modal aufgerufener, Dialog eine Lösung.
 
Zuletzt bearbeitet:
Wenn man direkt die API-Funktion verwendet, und den Owner (1. Parameter) null setzt, wird die MessageBox nicht-modal:

::MessageBox(NULL, _T("Message"), _T("Title"), MB_OK);

Allerdings kann man sie dann nicht mehr mit FindWindowEx() suchen, sondern muss FindWindow() verwenden. Der Titel sollte dann daher möglichst eindeutig sein.
 
Äh, wenn du da NULL reinsetzt, hat die MessageBox keinen Owner, aber sie ist immer noch modal.
Modal heisst, die Funktion (MessageBox in dem Fall) wartet, bis die MessageBox beendet ist.

Wenn du da NULL reinsetzt, kannst du auf deinem Hauptfenster rumklicken (wenn du eins hast) und damit einiges durcheinander bringen (zum Beispiel die MessageBox nochmal aufrufen).
 
Hallo Endurion, du hast schon recht, so richtig modal ist sie eigentlich nicht. Man kann aber programmtechnisch zumindest erreichen, dass das Hauptprogramm nicht blockiert wird, siehe Beispiel:

Code:
void CFooDlg::WasGetanWerdenMuss()
{
    SetTimer(1, 1, NULL); // Messagebox starten, ohne das Hauptprogramm zu blockieren

    // Erledigen, was noch so anfällt
}

void CFooDlg::OnTimer(UINT nIDEvent) 
{
    if( nIDEvent == 1 )
    {
        KillTimer(1);
        ::MessageBox(NULL, _T("Message Text"), _T("Message Box Titel"), MB_OK);
    }

    CDialog::OnTimer(nIDEvent);
}

Würde ich da den Owner eintragen, wäre das Hauptprogramm auf jeden Fall bis zum Schließen der Box blockiert.
Dass man noch auf dem Hauptfenster (oder sontstwo) rumklicken kann, ist ja der Sinn nicht-modaler Fenster. :)

Allerdings würde ich besser ein spezielles Message-Fenster konstruieren, dass man vernünftig kontrollieren kann, als diese Frickelei mit den MessageBoxen.
 
Zurück