Senden einer Nachricht

Die SendMessage -Funktion wird verwendet, um eine Nachricht direkt an einer Fensterprozedur. SendMessage Ruft eine Fensterprozedur auf und wartet, bis das Verfahren um die Nachricht zu verarbeiten und ein Ergebnis zurückgeben.

Eine Nachricht kann in das System zu beliebig Fenster gesendet werden; ein Fensterhandle ist alles, was erforderlich ist. Das System verwendet das Handle um zu bestimmen, welche Fensterprozedur die Nachricht erhalten sollen.

Vor der Verarbeitung einer Nachricht, die von einem anderen Thread gesendet wurden, sollte eine Fensterprozedur zunächst die InSendMessage -Funktion aufrufen. Wenn diese Funktion wahr zurückgibt, sollten die Fensterprozedur ReplyMessage vor eine beliebige Funktion aufrufen, die den Thread-Steuerelement ergeben verursacht, wie im folgenden Beispiel gezeigt.

fall WM_USER + 5: Wenn (InSendMessage()) ReplyMessage(TRUE); 
 
    DialogBox (hInst, "MyDialogBox", HwndMain, (DLGPROC) MyDlgProc); 
    Pause 

 

Eine Reihe von Nachrichten kann auf Steuerelemente in einem Dialogfeld gesendet werden. Diese Steuerungsmeldungen Darstellung, Verhalten und Inhalt von Steuerelementen festlegen oder Abrufen von Informationen über Steuerelemente. Beispielsweise die CB_ADDSTRING -Nachricht kann eine Zeichenfolge in ein Kombinationsfeld hinzufügen und die BM_SETCHECK -Nachricht kann den Aktivierungszustand des ein Kontrollkästchen oder Optionsfeld festgelegt.

Verwenden Sie die SendDlgItemMessage -Funktion, um eine Nachricht an ein Steuerelement angeben der Bezeichner des Steuerelements und das Handle des Fensters im Feld Dialogfeld, die das Steuerelement enthält. Im folgende Beispiel, aus einer Dialogfeldprozedur kopiert eine Zeichenfolge aus einem Kombinationsfeld-Edit-Steuerelement in der Listenfeld. Im Beispiel wird SendDlgItemMessage im Kombinationsfeld eine CB_ADDSTRING Nachricht zukommen.

HWND HwndCombo; 
Int cTxtLen; 
PSTR PszMem; 
 
Switch (uMsg) {Fall WM_COMMAND: wechseln (LOWORD(wParam)) {case IDD_ADDCBITEM: / / Get Handle des im Kombinationsfeld und die / / Länge der Zeichenfolge im Edit control / / des Kombinationsfelds. 
 
                HwndCombo = GetDlgItem (HwndDlg, IDD_COMBO); 
                cTxtLen = GetWindowTextLength(hwndCombo); 
 
                / / Reservieren von Arbeitsspeicher für den String und kopieren / / Zeichenfolge in den Speicher. 
 
                PszMem (PSTR) VirtualAlloc((LPVOID) NULL, (DWORD) = (cTxtLen + 1), MEM_COMMIT, PAGE_READWRITE); 
                GetWindowText (HwndCombo, PszMem, cTxtLen + 1); 
 
                / / Fügen Sie die Zeichenfolge in das Listenfeld von der / / Kombinationsfeld Feld und entfernen Sie die Zeichenfolge aus der / / edit-Steuerelement des Kombinationsfelds. 
 
                Wenn (* PszMem! = NULL) {SendDlgItemMessage (HwndDlg, IDD_COMBO, CB_ADDSTRING, 0, (DWORD) ((LPSTR) PszMem)); 
                    SetWindowText (HwndCombo, (LPSTR) NULL); 
                } / / Den Speicher frei und zurückgeben. 
 
                VirtualFree (PszMem, 0, MEM_RELEASE); 
                TRUE zurück; 
            / / / / Andere Dialogfeld Feld Befehle zu verarbeiten. 
            / /} / / / / Andere Dialogfeldmeldungen verarbeiten. 
    // 
 
} 

 

Index