Как перехватить сообщение windows

Тема в разделе "WASM.WIN32", создана пользователем CrazyFun, 3 ноя 2011.

  1. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Обрабатывать или изменять все сообщения (любого типа), посылаемые вызовом функции SendMessage (WH_CALLWNDPROC).
     
  2. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1. LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam)
    2. {
    3.     PMSG pMsg = (PMSG)lParam;
    4.     if (code == HC_ACTION)
    5.     {
    6.         if (pMsg->message == WM_SYSCOMMAND)
    7.             switch(pMsg->wParam)
    8.             {
    9.                 case SC_MINIMIZE:
    10.                     pMsg->message=WM_NUL;
    11.                     break;
    12.                 case SC_RESTORE:
    13.                     MessageBox(NULL, (LPCWSTR)L"SC_RESTORE", (LPCWSTR)L"WM_SYSCOMMAND", MB_OK);
    14.                     break;
    15.             }
    16.     }
    17.     return CallNextHookEx(Hook, code, wParam, lParam);
    18. }
     
  3. CrazyFun

    CrazyFun New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2005
    Сообщения:
    129
    punxer
    Собственно я там и перехватываю, а чтобы заблокировать сообщения подменяю оконную функцию через SetWindowLong. Но это громоздко.
    Про сабклассинг почитаю мб что путное найдется.
    Проблема ещё в том что окон в приложении очень много. При этом не все окна - окна Vcl. Да и с VCL окнами есть проблемы (одному и тому же VCL для работы с ним могут создаваться и уничтожаться windows-окна, то есть у окна меняется handle).
     
  4. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    punxer
    все в очередь становится.
    wm-help.net/books-online/book/59464/59464-20.html#h26
    CrazyFun
    SetWindowLong = сабклассинг
     
  5. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    ASMatic


    с другой стороны видно что в THREADINFO есть ссылки на две очереди-синхронные(SEND) и асинхронные(POST).

    Все ли сообщения мы можем получить через GetMessage PeekMessage?

    Ответ вроде бы очевиден - да.

    Тем не менее автор утверждает что в хуке сообщения не перехватываются (WH_GETMESSAGE)

    Но в WNDPROC тем не менее приходят
     
  6. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    CrazyFun
    Можно подменять ппроцедуру окна на уровне класса окна - суперклассинг...
     
  7. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    punxer
    тс юзает (как понял) SetWindowsHook(), но это не самый лучший способ получать все что нужно, лучше юзать SetWindowLong() и быть уверенным что придёт мессага на сворачивание окна.

    вот тут прекрасно видно как мессаги попадают в конечные обработчики
    http://wm-help.net/books-online.image-load.php?img_fname=rich/images/rihter26-2.jpg
     
  8. CrazyFun

    CrazyFun New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2005
    Сообщения:
    129
    В проекте много окон. При этом VCL создает и уничтожает windows окна для работы с одним и тем же VCL окном. То есть хотелось бы перехватывать сообщения на уровне процесса.
     
  9. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    ASMatic

    Ему нужно заблокировать сворачивание.
    SetWindowsHook() убивает двух зайцев : инжект и перехват. И поидее работать должен. Но коли нет так нет.


    или же SetClassLongPtr для всех окон класса если их много.
     
  10. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    VCL окно и WINDOWS окно одно и тоже. Лишь классы и стили окон разные
     
  11. CrazyFun

    CrazyFun New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2005
    Сообщения:
    129
    Это так, но VCL может пересоздавать окна для экземпляров TForm в процессе работы с ними. То есть у экземпляров TForm меняются Handle и все сопутствующее.

    SetClassLongPtr надо подумать, спасибо)
     
  12. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    ну тогда за хуками оставить внедрение и SetClassLongPtr)
     
  13. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    ясн, тогда да.
    но я бы сделал как советовали в №2 GetMessage() попатчить и не парится :0

    а логи по параметрам к функам я собираю с помощью виндбг
    bp /p<EPROCESS> user32!GetMessage".echo GET_WINDOW_LONG*******;dd poi(esp+4) L4;gc"
     
  14. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    ASMatic
    где там что то о патчить?
    Что ты имел ввиду? Чесслово не пойму. %)

    Ты про сплайс GetMessage? (оно того не стоит в этой задаче)
     
  15. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    если класс один\несколько, да - не имеет смысла.