2017-01-10 42 views
0

例如,我现在有一个MFC应用程序。用户可以单击用户名文本字段,然后输入用户名。然后用户可以点击密码文本框,然后输入密码。然后用户可以点击登录按钮。 在MFC应用程序,VS 2013年将产生相应的回调函数对我来说,就像这样:如何获得从同一应用程序生成的所有窗口消息?

afx_msg void OnBnClickedOk(); 
afx_msg void OnBnClickedCancel(); 

现在我想到: 当用户点击“鼠标左键”,我可以打印“左键点击”发送日志文件,当用户点击“取消按钮”时,我可以打印“取消按钮点击”到日志文件。 我知道我可以在每个回调函数中做到这一点。 喜欢:

void LoginDialog::OnBnClickedOk() 
{ 
    printToLog("Left Button click"); 
} 

但问题是,这个应用程序是非常大的,它至少有上百回调函数。我不能在每个回调函数中放置这个“printToLog”函数。 因此,是否有一个函数可以接收所有这些生成的Windows消息?如果有这样的功能,我可以在一个回调函数中添加我的printToLog函数。 我在网上搜索,https://msdn.microsoft.com/en-us/library/windows/desktop/ms632593(v=vs.85).aspx 但是这个链接中的东西并不是我所需要的。我无法修改现有的代码太多。

+0

也许你应该解释需要从代码中的每一个处理程序打印一条消息。似乎它出于某种调试原因而矫枉过正。 – rrirower

回答

1

您需要重载窗口类的PreTranslateMessage()。这是CWnd的虚拟功能。

步骤:

  1. 右键单击您在RC文件窗口
  2. 点击Class Wizard
  3. 在弹出的对话框中切换到Virtual Functions标签,然后搜索PreTranslateMessage
  4. 选择功能,并单击Add Function按钮在对话框的右侧
  5. 处理消息中的添加功能

它看起来像:

BOOL CEventFilterDlg::PreTranslateMessage(MSG* pMsg) 
{ 
    // TODO: Add your specialized code here and/or call the base class 

    return CDialogEx::PreTranslateMessage(pMsg); 
} 
+1

如何知道该按钮被点击或哪个文本框被此功能点击? – firstaccount

+0

我的意思是,有无论如何,我们可以使用“pMsg”来判断哪个按钮被点击? – firstaccount

+0

你应该看到'MSG'的定义,请看看[this](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644958(v = vs.85).aspx )。 –