选择另一个窗口时通知CDialog-Window

时间:2011-02-17 11:21:31

标签: c++ windows winapi mfc onkillfocus

我有一个基于对话框的MFC-Tool,当我点击它时,它应该在消息框中显示另一个应用程序窗口的标题。 我的问题是WM_KILLFOCUS在这里不起作用。也许我做错了。 我做了以下事情:

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

知道什么是错的吗?

3 个答案:

答案 0 :(得分:0)

这是我的猜测

替换HWND hwnd(GetForegroundWindow());使用GetActiveWindow(void)。

答案 1 :(得分: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类。没有理由你不得不再处理一组TCHAR s了。我可能会这样写:

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

答案 2 :(得分:0)

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

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

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