c ++ - Meddel cdialog-vindue, når du vælger et andet vindue
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);
}
}