我有一个基于对话框的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);
}
}
知道什么是错的吗?
答案 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做我需要的。当焦点设置和/或丢失时,它会通知我的对话框。