c ++ - Meddel cdialog-vindue, når du vælger et andet vindue

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et dialogbaseret MFC-værktøj, der skal vise titlen på et vindue i et andet program i en meddelelsesboks, når jeg klikker på den.
Mit problem er, at WM\_KILLFOCUS ikke virker her. Måske gør jeg det galt.
Jeg gør følgende:


BEGIN\_MESSAGE\_MAP(CMyDlg, CDialog)
    ON\_WM\_KILLFOCUS()
END\_MESSAGE\_MAP()

...
...

void CMyDlg::OnKillFocus( CWnd* pNewWnd )
{
    CDialog::OnKillFocus(pNewWnd);
    if(m\_bSelectorModeActive)
    {
        HWND hwnd(GetForegroundWindow());
        TCHAR buf[512];
        ::GetWindowText(hwnd, buf, 512);
        MessageBox(buf);
    }
}


Enhver ide, hvad er der galt?

Bedste reference


Dette er mit gæt


Udskift HWND hwnd (GetForegroundWindow ()); med GetActiveWindow (void).

Andre referencer 1


Jeg har løst det, tak for din indsats.


Ja, jeg bruger CStrings, dette var bare et lille eksempel på en lidt mere kompleks ting jeg gør. Mit problem var ikke selve funktionen, men begivenheden WM\_KILLFOCUS, der ikke syntes at fungere.
Måske var jeg ikke nok nok her, undskyld.


WM\_ACTIVATE gør hvad jeg har brug for. Det meddeler min dialog, når fokus er angivet og/eller tabt.

Andre referencer 2


Koden, du har vist, burde ikke kompilere. Funktionen GetForegroundWindow, der leveres af MFC, returnerer ikke en HWND, så du kan ikke initialisere variablen hwnd ved hjælp af dens returværdi.


Hvis du vil have en HWND, skal du ringe GetForegroundWindow fra Windows API ved at slippe opkaldet med ::, ligesom du gjorde for GetWindowText. Så simpelthen omskrive din kode som følger:


void CMyDlg::OnKillFocus( CWnd* pNewWnd )
{
    CDialog::OnKillFocus(pNewWnd);
    if(m\_bSelectorModeActive)
    {
        HWND hwnd(::GetForegroundWindow());
        TCHAR buf[512];
        ::GetWindowText(hwnd, buf, 512);
        MessageBox(buf);
    }
}


Udover det, ved man kigger på din kode, undrer man sig over, at du tilsyneladende ignorerer MFC'en med objektorientering, så ydmygt forsøger at medbringe Windows API. Du behøver ikke at arbejde direkte med vindueshåndtag. Og man kan argumentere for, at den mest overbevisende årsag til at bruge MFC er dens CString klasse. Der er ingen grund til at du skal håndtere en række TCHAR s længere. Jeg kan skrive dette i stedet:


void CMyDlg::OnKillFocus( CWnd* pNewWnd )
{
    CDialog::OnKillFocus(pNewWnd);
    if(m\_bSelectorModeActive)
    {
        CWnd* pForeWnd = GetForegroundWindow();
        CString windowText;
        pForeWnd->GetWindowText(windowText);
        MessageBox(windowText);
    }
}