Данная задача возникает часто при отладке. Хочется видеть список сообщений, которые поступают скажем в диалоговое окно. При том посмотреть их в виде лог файла. Или еще чего. Есть ряд средств, например, SPY, которые позволяют это сделать. Только зачем, если у нас есть исходный код.
Создавайте проект MFC AppWizard на основе диалогового окна по максимуму отключив все кнопки. Теперь давайте создадим функцию PreTranslateMessage, на ней просто надо щелкнуть два раза и она появится в исходном коде.
Мы хотим вести лог файл только при отладке. Поэтому все, что относится к логу мы заключим в следующие операторы
#ifdef _DEBUG // это включится только в режиме отладки. #endifВключаем библиотеку файловых потоков
#include "TestEnterDlg.h" #ifdef _DEBUG #include "fstream.h" #endifВ конструкторе создаем поток.
CTestEnterDlg::CTestEnterDlg(CWnd* pParent /*=NULL*/) : CDialog(CTestEnterDlg::IDD, pParent) { //{{AFX_DATA_INIT(CTestEnterDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 #ifdef _DEBUG ofs.open("log.txt"); #endif m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }Во время закрытия окна закрываем. Для этого необходимо создать функцию DestroyWindow. Её тоже можно создать в ClassWizard.
BOOL CTestEnterDlg::DestroyWindow() { // TODO: Add your specialized code here and/or call the base class #ifdef _DEBUG ofs.close(); #endif return CDialog::DestroyWindow(); }Ну и теперь то, что нас интересует.
BOOL CTestEnterDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class #ifdef _DEBUG ofs << pMsg->message << endl; #endif return CDialog::PreTranslateMessage(pMsg); }Теперь если запустить именно отладочную версию Debug, а не реализ, то при работе программы будет создан лог файл. Что в нем ???? Вот что
.... 160 160 512 512 512 512 512 ...Что это за сообщения ? Это сообщения в десятичном формате. Их надо перевести в шестнадцатеричный. Для этого можно воспользоваться обычным калькулятором. Поставьте научный вид. Переключитесь на DEC, введите десятичное число, а потом на Hex и увидите число в шестнадцатеричном виде.
Для интерпретации осталось немного. Первое, открыть файл WinUser.h. Там есть сообщения, они начинаются в WM_. Так давайте посмотрим, что это за 512.
512->200 #define WM_MOUSEFIRST 0x0200 #define WM_MOUSEMOVE 0x0200
Это двигалась мышка !!!