Всем доброго времени суток. Хочу сделать так чтобы при завершении определенного приложения, оно не завершалось а просто исчезало окно, т.е. хукаю ExitProcess, а там уже сворачиваю само окно оставляя сам процесс функционирующим решил вызывать ShowWindow(hWnd, SH_HIDE) - вот два вопроса, сработает ли такой способ и как получить handle окна hWnd в своем же процессе, что то гугл ответа не дал. -- да, в процесс попадает моя длл.
Получить свой PID. Перечислить все hWnd через EnumWindows, и в диспетчере вызывая GetWindowThreadProcessId и сравнить со своим PID.
Flasher хм сделал именно так, проблема в том что перечисляет все пиды кроме моего т.е. как раз текущего процесса, в чем может быть проблема? Код (Text): BOOL CALLBACK MyEnumProc(HWND hWnd, LPARAM lParam) { DWORD pid = 0; GetWindowThreadProcessId( hWnd, &pid ); if ( pid == GetCurrentProcessId() ) { MessageBox( 0, "ok", "ok", 0 ); // ShowWindow( hWnd, SW_HIDE ); } return TRUE; } void FindMyHwnd(void) { EnumWindows(MyEnumProc, 1); }
Вот asm версия, думаю ничего не упустил.. Код (Text): .data processentry32 PROCESSENTRY32 <> szFileName db "test.exe",0 .code FindWnd proc hWnd:DWORD,lParam:DWORD local dwPid:dword invoke GetWindowThreadProcessId,hWnd,addr dwPid mov eax,dwPid .if eax == lParam ; ------ mov eax,0 ret .endif mov eax,1 ret FindWnd endp start: invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0 mov esi,eax mov dword ptr [processentry32],sizeof processentry32 invoke Process32First,esi,offset processentry32 @1: invoke lstrcmpi,addr processentry32.szExeFile,offset szFileName or eax,eax jnz @2 invoke EnumWindows,offset FindWnd,processentry32.th32ProcessID @2: invoke Process32Next,esi,offset processentry32 test eax,eax jnz @1 invoke CloseHandle,esi invoke ExitProcess,0 end start
спасибо еще раз, но всё тоже самое ..., и результат тот же самый почему то перечисляются все пиды но кроме того откуда всё это вызывается т.е. кроме моего процесса.
xdd Завершение приложения - не точечная операция, это может быть нетривиальный процесс освобождения ресурсов, сохранения состояния и проч. Если имеется в виду конец этого процесса, т.е. собственно ExitProcess, то уже поздно что-либо делать с окном - его уже нет (если, конечно, прога не криво написана). Чтобы можно было потом, включив окно, продолжить работу с приложением, тебе нужно перехватить самое начало процесса завершения, что в общем случае сделать нельзя. Впочем, в простых случаях достаточно хукать WM_CLOSE.
green спасибо, но дальнейшая работа с приложением и не планируется, т.е. она будет, но не будет видно окна, я даже еще до этого просто не дашел, я незнаю как hwnd окна получить
offtop: может подскажете, что происходит когда в explorer нажимаешь F5 или кнопку ресет? Всмысле что за апи как называется?