2009-10-07 10 views
9

Ich möchte eine Nachricht mit MessageBox (oder ähnlich) ausdrucken. Ich möchte auch kontrollieren, wo genau auf dem Bildschirm die Box angezeigt wird, aber nichts in der Beschreibung von MessageBox finden, die Ihnen die Kontrolle über den Speicherort ermöglicht. Habe ich etwas verpasst? Wenn MessageBox nicht verwendet werden kann, gibt es dann eine Alternative?Standort der MessageBox festlegen?

Aus Gründen, die hier zu komplex sind, würde ich eine Antwort bevorzugen, bei der ich kein eigenes Fenster erstellen und die Adresse einer Callback-Funktion übergeben muss.

Antwort

12

Schritt 1: erstellen CBT Haken die Erstellung des Nachrichtenfelds zu stoppen:

// global hook procedure 
HHOOK hhookCBTProc = 0; 

LRESULT CALLBACK pfnCBTMsgBoxHook(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode == HCBT_CREATEWND) 
    { 
    CREATESTRUCT *pcs = ((CBT_CREATEWND *)lParam)->lpcs; 

    if ((pcs->style & WS_DLGFRAME) || (pcs->style & WS_POPUP)) 
    { 
     HWND hwnd = (HWND)wParam; 

     // At this point you have the hwnd of the newly created 
     // message box that so you can position it at will 
     SetWindowPos(hwnd, ...); 
    } 
    } 

    return (CallNextHookEx(hhookCBTProc, nCode, wParam, lParam)); 
} 

Schritt 2: den Haken vor und nach der Darstellung des Meldungsfeld Installieren/Entfernen:

// set hook to center the message box that follows 
hhookCBTProc = SetWindowsHookEx(WH_CBT, 
           pfnCBTMsgBoxHook, 
           0, GetCurrentThreadId()); 

int sResult = MessageBox(hwndParent, pszMsg, pszTitle, usStyle); 

// remove the hook 
UnhookWindowsHookEx(hhookCBTProc); 
4

Wenn ich zusätzliches Verhalten für eine Messagebox brauchte, habe ich immer mein eigenes Fenster erstellt und es wie eine Standard MessageBox aussehen lassen. Sie machen es richtig und Sie können es immer wieder in anderen Projekten verwenden.

3

MessageBox ist im Grunde eine Reihe von Ausfällen. Mag sie nicht? Bring dein eigenes mit. Wenn Sie kein echtes Fenster mit all seinen Komplexitäten wollen, aber MessageBox zu restriktiv ist, erstellen Sie einen Dialog.