0

I got a dialog-based MFC-Tool that is supposed to show the title of a window of another application in a messagebox when i click on it. My Problem is that the WM_KILLFOCUS doesn't work here. Maybe I'm doing it wrong. I do the following:

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);
    }
}

Any idea what's wrong?

4

3 回答 3

0

这是我的猜测

替换 HWND hwnd(GetForegroundWindow()); 与 GetActiveWindow(void) 。

于 2011-02-17T11:29:18.083 回答
0

我解决了,谢谢你的努力。

是的,我确实使用 CStrings,这只是我做的更复杂的事情的一个小例子。我的问题不是函数本身,而是似乎不起作用的事件 WM_KILLFOCUS。也许我在这里不够清楚,对不起。

WM_ACTIVATE 做我需要的。当焦点设置和/或丢失时,它会通知我的对话框。

于 2011-02-17T11:45:50.807 回答
0

您显示的代码甚至不应该编译。MFC 提供的GetForegroundWindow函数不返回HWND,因此您无法hwnd使用其返回值初始化变量。

如果你想得到一个HWND,你需要GetForegroundWindow通过转义调用来从 Windows API 调用::,就像你为GetWindowText. 因此,只需按如下方式重写您的代码:

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

除此之外,在查看您的代码时,人们会奇怪您似乎忽略了面向对象 MFC 如此谦虚地尝试将其引入 Windows API。您不需要直接使用窗口句柄。有人可能会争辩说,使用 MFC 最令人信服的原因是它的CString类。没有理由再处理TCHARs 数组了。我可能会写这个:

void CMyDlg::OnKillFocus( CWnd* pNewWnd )
{
    CDialog::OnKillFocus(pNewWnd);
    if(m_bSelectorModeActive)
    {
        CWnd* pForeWnd = GetForegroundWindow();
        CString windowText;
        pForeWnd->GetWindowText(windowText);
        MessageBox(windowText);
    }
}
于 2011-02-17T11:35:23.567 回答