PDA

Visualizza la versione completa : [C++] Finestre senza logica Win 32


kirakira93
27-05-2010, 17:39
Ciao ragazzi, premetto, spero di aver trovato un titolo apppropriato e che questa discussione non sia considerata OT. :)
Comunque, io ho sviluppato un semplice programma che trova hProc da un HWND,


DWORD dwPiD ;
GetWindowThreadProcessId(
GetForegroundWindow(),
&dwPiD
);




e trova l'HWND con GetForegroundWindow().
Poi uccide gentilmente il processo....molto utile se devo terminare giochi (senza dover fare menu....esci....etc....) oppure processi che fanno spuntare MessageBox()



BOOL KillProcess(DWORD dwProcessId, UINT uExitCode)
{
DWORD dwDesiredAccess = PROCESS_TERMINATE;
BOOL bInheritHandle = FALSE;
HANDLE hProcess = OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
if (hProcess == NULL)
return FALSE;

BOOL result = TerminateProcess(hProcess, uExitCode);

CloseHandle(hProcess);

return result;
}


La domanda :
Prima per caso ho provato a terminare kaspersky antivirus con questo metodo.....e MAGIA! non successo nulla!!! :eek: :eek: :eek: ......come possibile una cosa dal genere??? ogni finestra dovrebbe avere un HWND, compresa quella di Kaspersky!
allora ho pensato: che per caso abbiano utilizzato un metodo inventato da loro per creare finestre???? proprio per difendersi dai virus? non capisco, mi sembra un fatto impossibile!!!

oregon
27-05-2010, 17:44
Intanto non hai agito tanto "gentilmente" dato che hai utilizzato la terminate (dovresti utilizzare un messaggio WM_CLOSE per essere "educato").

In secondo luogo, parli di giochi e poi vuoi terminare l'antivirus ... mmmh ... :madai!?:

Infine, possibile che l'antivirus abbia un processo "sentinella" che controlli quello principale per riavviarlo in caso di caduta ... oppure, non hai semplicemente i "diritti" per farlo ...

kirakira93
27-05-2010, 18:45
Sono consapevole che questa richiesta pu sembrare un po' strana....
comunque non per scopi malefici non di certo....
bhe problema risolto: se disabilito lqa self defense di kaspersky tutto va apposto (nel senso che riesco a terminare il processo.....)
resta comunque un mistero capire come abbia fatto firefox.....proprio la chiamata a


BOOL result = TerminateProcess(hProcess, uExitCode);

retituisce FALSE !!!!
vabb.....pazienza

oregon
27-05-2010, 18:53
Se una API fallisce, chiama la GetLastError e mostra il codice d'errore.

kirakira93
27-05-2010, 20:40
Ho provato con GetLastError()
viene fuori il valore 0: ERROR_SUCCES.......per questo mistero....:)

oregon
27-05-2010, 20:41
Originariamente inviato da kirakira93
Ho provato con GetLastError()
viene fuori il valore 0: ERROR_SUCCES.......per questo mistero....:)

No ... questo non possibile.

Naturalmente la GetLastError va eseguita subito dopo la API che fallisce ...

kirakira93
27-05-2010, 20:48
subito vuol dire prima anche di un semplice messagebox?

Ho fatto cos io:
//string
//sstream
//namespace std
BOOL KillProcess(DWORD dwProcessId, UINT uExitCode)
{
DWORD dwDesiredAccess = PROCESS_TERMINATE;
BOOL bInheritHandle = FALSE;
HANDLE hProcess = OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
if (hProcess == NULL)
return FALSE;

BOOL result = TerminateProcess(hProcess, uExitCode);
if(result == FALSE)
{
string s;
stringstream out;
out.str("");
out << GetLastError();
s = out.str();
out.str("");
MessageBox(NULL,s.c_str(),"Output = 0",0);
}
CloseHandle(hProcess);

return result;
}

MItaly
27-05-2010, 21:17
Originariamente inviato da kirakira93
subito vuol dire prima anche di un semplice messagebox?

Vuol dire prima di qualunque altra chiamata alle API di Windows, che modificano il lasterror per segnalare le condizioni di errore.

oregon
27-05-2010, 21:22
Originariamente inviato da kirakira93
subito vuol dire prima anche di un semplice messagebox?

Subito significa subito.

BOOL result = TerminateProcess(hProcess, uExitCode);
int le = GetLastError();

kirakira93
27-05-2010, 21:30
ok domani provo.....grazie :)
spero di capire sto mistero!

Loading