объекты GDI, окна и вообще не знаю что...

Тема в разделе "WASM.WIN32", создана пользователем Hexxxx, 28 янв 2005.

  1. Hexxxx

    Hexxxx New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    7
    Нужно мне делать скриншот окна перед закрытием. Ловить всякие WM_Destroy и WM_close бесполезно. Окно начинает ищезать раньше, чем сообщение приходит в обработчик сообщений. Я так понимаю удаление окна начинается с удаления объектов GDI может быть даже в ядре, а потом только доходит сообщение WM_Destroy до самой проги. Где можно это отловить?
     
  2. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Код (Text):
    1. case WM_SHOWWINDOW:
    2.   if (! wParam) {
    3.     // Window is about to be hidden...
    4.     }
    5.   break;
     
  3. Hexxxx

    Hexxxx New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    7
    забыл сказать мне надо ловить не в своей а в чужой.

    P.S. WM_SHOWWINDOW c wParam=0 не приходит при закрытии окна.
     
  4. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    WM_DESTROY приходит после удаления окна, а WM_CLOSE до этого, т.е. можно обнулить message, вызвать DefWindowProc и окно останется на экране. Т.ч. пробуй ловить WM_CLOSE (чего там надо, сабкласить или хуки?), делай скриншот, потом передавай WM_CLOSE дальше, на закрытие
     
  5. vinnie_pooh

    vinnie_pooh New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    98
    case WM_SHOWWINDOW:

    if (! wParam) {

    // Window is about to be hidden...

    }

    break;




    не работает в TASM и RadASM, но почему-то работает в Visual C++ 6.0 MFC !!!???



    case WM_CLOSE:

    РАБОТАЕТ ВЕЗДЕ.



    P.S. Если я ошибся, значит, слишком много пива.
     
  6. Hexxxx

    Hexxxx New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    7
    WM_CLOSE не приходит если окно закрывается по нажатию на Cancel(ну знаете есть в VC default обработчики).
     
  7. Hexxxx

    Hexxxx New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    7
    Идеи кончились?
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    Ты, наверное, думаешь, что все соберутся в кружочек и будут придумывать тебе решения проблемы?
     
  9. ssx

    ssx Member

    Публикаций:
    0
    Регистрация:
    19 авг 2003
    Сообщения:
    336
    Hexxxx

    Хекс, ты ли это?:)
     
  10. vinnie_pooh

    vinnie_pooh New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    98
    если MFC Dialog based, то
    Код (Text):
    1. case WM_COMMAND:
    2.     if(wParam == IDCANCEL)
    3.         //is closing
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Hexxxx

    > Ловить всякие WM_Destroy и WM_close бесполезно.



    Не правда!
    Код (Text):
    1. switch(msg)
    2.   {
    3. ..........
    4.    case WM_CLOSE:
    5. <font color="red]// здесь можешь легко снять свой скриншот</font><!--color-->
    6.       EndDialog(hwnd, 0);
    7.       break;
    8. ................
     
  12. vinnie_pooh

    vinnie_pooh New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    98
    Asterix



    Если в MFC Dialog based-приложении нажать на Enter или Escape, то диалог закрывается, но WM_CLOSE не приходит. Это видно в Spy++. Наверное, Hexxxx это имеет ввиду. Так что остается
    Код (Text):
    1. LRESULT MyDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
    2. {
    3.     if(message == WM_COMMAND)
    4.         if(wParam == IDCANCEL || wParam == IDOK)
    5.             DoGrabWindow();
    6.    
    7.     return CDialog::WindowProc(message, wParam, lParam);
    8. }
     
  13. Hexxxx

    Hexxxx New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    7
    to ssx: Да это я.

    to IceStudent: да, думаю все собирутся и мне помогут. :)

    to Asterix: именно это и имелось в виду.



    Это все хорошо в теории. А вы возьмите софтайс и попробуйте ловить эти сообщения и сразу увидите где оно закрывается, а где нет. Например в The Bat'e я так и не нашел сообщение при котором можно отловить закрытие окна "Account Propeties". Иногда, когда окно закрывается по WM_CLOSE и его действительно можно поймать перед закрытием и сделать скриншот. Но ведь окно закрывает (стирает его с экрана) какая-та общая для всех окон функция. Именно ее я и пытаюсь найти. Потому что сообщения, как вы могли заметить, это очень нестабильная штука.
     
  14. vinnie_pooh

    vinnie_pooh New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    98




    Просто при закрытии окна нижележащим окнам приходит WM_PAINT, и они сами отрисовывают открывшийся участок.
     
  15. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    SetWindowsHookEx(WH_SHELL, ...) и обработка HSHELL_WINDOWDESTROYED не помогает?
     
  16. Hexxxx

    Hexxxx New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    7
    WM_PAINT не приходит, можно даже в Spy это посмотреть.

    А чем мне поможет SetWindowsHookEx на WH_SHELL? Я ж не собираюсь ловить только окна принадлежайщие Shell.
     
  17. vinnie_pooh

    vinnie_pooh New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    98




    Hexxxx, я имел ввиду, что нет функции, которая стирает окно с экрана. Понятно, что закрываемому окну WM_PAINT не приходит. Скажи, ты хочешь отловить момент закрытия чужого приложения? Не конкретного, а любого?
     
  18. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Hexxxx >




    MSDN:
    Код (Text):
    1. LRESULT CALLBACK ShellProc(          int nCode,
    2.     WPARAM wParam,
    3.     LPARAM lParam
    4. );
    и далее:





    В аттаче пример, который ведёт лог всех создаваемых / закрываемых окон верхнего уровня на основе хука WH_SHELL (возможно там есть баги!!! :)



    [​IMG] _820438832__wnd_mon.zip
     
  19. Hexxxx

    Hexxxx New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    7
    Shell мне не катит он ловит только верхний уровень, т.е. создание/закрытие главного окна. А вот уже всякие MessageBox и диалоги оно не ловит :dntknw:





    А я хочу иметь возможность ловить ЛЮБОЕ окно, вне зависимости от того кто и как их создал. Чтобы был универсальный метод для всех окон не привязываясь к языку на котором прога написана т.е. надо ловить окна и Java, Visual foxpro, и VB, и делфи и сишных программ.
     
  20. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    если

    SetWindowsHookEx(WH_CBT,...,...,...);

    далее ловить HCBT_DESTROYWND

    для MsgBox'ов точно катит :derisive:



    Edited:

    мля, я совсем забыл что окна в этот момент уже не видно %)

    тогда остаётся только хучить какую-нить API, например GetMessage,

    и ловить возможно WM_QUIT.