【问题标题】:Notify CDialog-Window when selecting another window选择另一个窗口时通知 CDialog-Window
【发布时间】:2011-02-17 11:21:30
【问题描述】:

我有一个基于对话框的 MFC 工具,当我单击它时,它应该在消息框中显示另一个应用程序的窗口标题。 我的问题是 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);
    }
}

知道有什么问题吗?

【问题讨论】:

    标签: c++ windows winapi mfc onkillfocus


    【解决方案1】:

    这是我的猜测

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

    【讨论】:

      【解决方案2】:

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

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

      WM_ACTIVATE 可以满足我的需要。它会在焦点设置和/或丢失时通知我的对话框。

      【讨论】:

      • 我很确定我的最后一个答案是完全离题的。我试图只看文档,但这并不总是最聪明的举动。我实际上是在一个示例项目中尝试过的,并且我已经相应地更新了我的答案。我现在展示的代码可以正常工作。唯一的问题是,如果您的对话框中有任何子控件,当用户在它们之间切换时,您将收到很多“误报”WM_KILLFOCUS 消息。
      【解决方案3】:

      您显示的代码甚至不应该编译。 MFC提供的GetForegroundWindow函数没有返回HWND,所以你不能用它的返回值来初始化hwnd变量。

      如果您想获得HWND,您需要通过使用:: 转义调用从Windows API 调用GetForegroundWindow,就像您为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);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2023-03-31
        • 1970-01-01
        • 2021-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多