Как получить все сообщения Windows, сгенерированные из одного и того же приложения?

Например, у меня сейчас есть приложение 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 Но материалы по этой ссылке не то, что мне нужно. Я не могу слишком сильно пересматривать существующий код.


person firstaccount    schedule 10.01.2017    source источник
comment
Возможно, вам следует объяснить необходимость печатать сообщение от каждого обработчика в вашем коде. Похоже, что это излишне по какой-то причине отладки.   -  person rrirower    schedule 10.01.2017


Ответы (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);
}
person zhm    schedule 10.01.2017
comment
Как узнать, какая кнопка нажата или какое текстовое поле нажато этой функцией? - person firstaccount; 10.01.2017
comment
Я имею в виду, можем ли мы использовать pMsg, чтобы определить, какая кнопка нажата? - person firstaccount; 10.01.2017
comment
Вы должны увидеть определение MSG, взгляните на это. - person zhm; 10.01.2017
comment
Я вижу это. В MSG у него есть параметр, называемый сообщением. Это может идентифицировать ввод с клавиатуры или мышь, что означает, что он может определить, является ли это WM_LBUTTONDOWN или нет, но он не может определить BN_CLICKED. - person firstaccount; 10.01.2017
comment
Неважно, я знаю, как получить это по этой ссылке: stackoverflow.com/questions/20640330/ - person firstaccount; 10.01.2017