скрыть/получить хендл окна

Тема в разделе "WASM.BEGINNERS", создана пользователем xdd, 14 апр 2009.

  1. xdd

    xdd New Member

    Публикаций:
    0
    Регистрация:
    7 апр 2009
    Сообщения:
    13
    Всем доброго времени суток.
    Хочу сделать так чтобы при завершении определенного приложения, оно не завершалось а просто исчезало окно, т.е. хукаю ExitProcess, а там уже сворачиваю само окно оставляя сам процесс функционирующим
    решил вызывать ShowWindow(hWnd, SH_HIDE) - вот два вопроса, сработает ли такой способ и как получить handle окна hWnd в своем же процессе, что то гугл ответа не дал.
    --
    да, в процесс попадает моя длл.
     
  2. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Получить свой PID.
    Перечислить все hWnd через EnumWindows, и в диспетчере вызывая GetWindowThreadProcessId и сравнить со своим PID.
     
  3. xdd

    xdd New Member

    Публикаций:
    0
    Регистрация:
    7 апр 2009
    Сообщения:
    13
    Flasher
    хм сделал именно так, проблема в том что перечисляет все пиды кроме моего т.е. как раз текущего процесса, в чем может быть проблема?

    Код (Text):
    1. BOOL CALLBACK MyEnumProc(HWND hWnd, LPARAM lParam)
    2. {
    3.     DWORD pid = 0;
    4.  
    5.     GetWindowThreadProcessId( hWnd, &pid );
    6.  
    7.     if ( pid == GetCurrentProcessId() )
    8.     {
    9.                 MessageBox( 0, "ok", "ok", 0 );
    10.     //  ShowWindow( hWnd, SW_HIDE );
    11.     }
    12.    
    13.  
    14.     return TRUE;
    15. }
    16.  
    17. void FindMyHwnd(void)
    18. {
    19.     EnumWindows(MyEnumProc, 1);
    20. }
     
  4. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Вот asm версия, думаю ничего не упустил..
    Код (Text):
    1. .data
    2. processentry32 PROCESSENTRY32 <>
    3. szFileName db "test.exe",0
    4.  
    5. .code
    6. FindWnd proc hWnd:DWORD,lParam:DWORD
    7.      local dwPid:dword
    8.        invoke GetWindowThreadProcessId,hWnd,addr dwPid
    9.        mov eax,dwPid
    10.        .if eax == lParam
    11.           ; ------
    12.           mov eax,0
    13.           ret
    14.        .endif
    15.        mov eax,1
    16.        ret
    17. FindWnd endp
    18. start:
    19.        invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
    20.        mov esi,eax
    21.        mov dword ptr [processentry32],sizeof processentry32
    22.        invoke Process32First,esi,offset processentry32
    23.     @1:
    24.        invoke lstrcmpi,addr processentry32.szExeFile,offset szFileName
    25.         or eax,eax
    26.         jnz @2
    27.        invoke EnumWindows,offset FindWnd,processentry32.th32ProcessID
    28.     @2:
    29.        invoke Process32Next,esi,offset processentry32
    30.        test eax,eax
    31.        jnz @1
    32.        invoke CloseHandle,esi
    33.        invoke ExitProcess,0
    34. end start
     
  5. xdd

    xdd New Member

    Публикаций:
    0
    Регистрация:
    7 апр 2009
    Сообщения:
    13
    спасибо еще раз, но всё тоже самое ..., и результат тот же самый :)
    почему то перечисляются все пиды но кроме того откуда всё это вызывается т.е. кроме моего процесса.
     
  6. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    xdd
    Завершение приложения - не точечная операция, это может быть нетривиальный процесс освобождения ресурсов, сохранения состояния и проч.
    Если имеется в виду конец этого процесса, т.е. собственно ExitProcess, то уже поздно что-либо делать с окном - его уже нет (если, конечно, прога не криво написана).
    Чтобы можно было потом, включив окно, продолжить работу с приложением, тебе нужно перехватить самое начало процесса завершения, что в общем случае сделать нельзя. Впочем, в простых случаях достаточно хукать WM_CLOSE.
     
  7. xdd

    xdd New Member

    Публикаций:
    0
    Регистрация:
    7 апр 2009
    Сообщения:
    13
    green
    спасибо, но дальнейшая работа с приложением и не планируется, т.е. она будет, но не будет видно окна, я даже еще до этого просто не дашел, я незнаю как hwnd окна получить :)
     
  8. xdd

    xdd New Member

    Публикаций:
    0
    Регистрация:
    7 апр 2009
    Сообщения:
    13
    не узрел, тогда окно отпадает, думаю тогда просто его хуком обойдусь
     
  9. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    777
    offtop: может подскажете, что происходит когда в explorer нажимаешь F5 или кнопку ресет? Всмысле что за апи как называется?