PDA

View Full Version : [Win32] Inviare Ctrl+C ad un altro processo


71104
23-03-2007, 18:59
sembrerà banale come domanda (specie fatta da me che passo le mie ore sul forum a propagandare Windows e Win32 :p) ma non riesco a trovare un modo... :wtf:

come si fa a simulare Ctrl+C in un altro processo, sapendo ovviamente che si tratta di un programma console? è possibile?

71104
24-03-2007, 14:23
up :help:

Rubberick
24-03-2007, 14:43
in pratica il problema che vorremmo risolvere sarebbe quello di mandare un comando di "term" cioe' non il kill classico, il comando di chiusura della console, come se cliccassi sulla X di chiusura della finestra

c'e' modo di emularlo in qualche modo avendo i diritti di admin? grazie :)

71104
24-03-2007, 14:59
oddio alla X di chiusura non c'avevo pensato... :D :D :D
faccio un tentativo di WM_SYSCOMMAND :mc:

71104
24-03-2007, 15:02
ehm, ora il bello però è capire se effettivamente il processo è basato su un eseguibile CUI o GUI... :|

esiste un'API che mi permette di saperlo? :D
non mi dite che devo andare a leggere gli headers dell'eseguibile :mc:

Rubberick
24-03-2007, 19:53
oddio alla X di chiusura non c'avevo pensato... :D :D :D
faccio un tentativo di WM_SYSCOMMAND :mc:

:mbe: e tu saresti un programmatore? :stordita:

marco.r
24-03-2007, 20:38
ehm, ora il bello però è capire se effettivamente il processo è basato su un eseguibile CUI o GUI... :|

esiste un'API che mi permette di saperlo? :D
non mi dite che devo andare a leggere gli headers dell'eseguibile :mc:

ehm non ho idea di come fare in C, ma in python si farebbe qualcosa di simile:

def kill(pid):
import win32api
handle = win32api.OpenProcess(1, 0, pid)
return (0 != win32api.TerminateProcess(handle, 0))

In teoria OpenProcess e TerminateProcess dovrebbero essere api standard di Windows, per cui la traduzione dovrebbe essere abbastanza banale.

71104
24-03-2007, 23:37
ehm non ho idea di come fare in C, ma in python si farebbe qualcosa di simile:

def kill(pid):
import win32api
handle = win32api.OpenProcess(1, 0, pid)
return (0 != win32api.TerminateProcess(handle, 0))

In teoria OpenProcess e TerminateProcess dovrebbero essere api standard di Windows, per cui la traduzione dovrebbe essere abbastanza banale. ti ringrazio, ma questa è terminazione brutale, non è quello che cerco; senza contare che ti sei scordato di chiudere l'HANDLE :D

a dire il vero Ctrl+C è implementato tramite SEH: fa saltare un'eccezione che risale fino all'handler di qualche DLL di Windows (presumibilmente kernel32.dll), il quale esce dal processo in una maniera che somiglia molto alla terminazione brutale; di conseguenza TerminateProcess dovrebbe essere la stessa cosa in molti casi. ma in teoria un programma potrebbe aver installato un handler per Cltr+C, il quale non verrebbe eseguito in seguito a una TerminateProcess.

71104
24-03-2007, 23:41
MHWUAMWHAUWMAHWAUWMAHWUAMWHAUWAMHWUA (http://msdn2.microsoft.com/en-us/library/ms683155.aspx) XDXDXDXD

71104
24-03-2007, 23:45
però resta il problema di come fare a sapere se è CUI o GUI... :mbe: