jace1975
Messages postés81Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention12 octobre 2007
-
3 nov. 2005 à 20:34
jace1975
Messages postés81Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention12 octobre 2007
-
5 nov. 2005 à 15:34
salut à tous
je travaille actuellement sur une application, pour me permettre notamment de killer immédiatement le processus en cours via un raccourci clavier (genre shift F4 et le jeu auquel vous jouez se ferme immédiatement juste quand le boss rentre dans le bureau )
Je m'inspire en fait d'une application qu'un collègue m'as passé et qui se revèle indispensable très rapidement(Si vous souhaitez l'avoir demander moi par mail) , auquel je voudrais rajouter quelques fonctionnalités (que j'ai dejà dvlpé mais il me manque le principal )
Deux problèmes pour le développement :
- J'aimerais, à l'instar de l'appli que je cite briévement, me passer de toutes dll (après de longues recherche sur internet je n'ai pas réussi à trouver le début d'une piste pour m'en passer). si quelqu'un a une idée je suis preneur
- je n'arrive pas à récupérer le processus de l'application en cours, la procédure que j'utilise me renvoie systématiquement mon programme à cause je pense du hook et de son implémentation dans mon pgm. Si quelqu'un c'est faire ça, qu'il n'hésites pas à répondre , je galère depuis un bout de temps.
Pour la récupération du processus, voici une fonction que j'utilise pour vérifier si un processus tourne, tu devrais en tirer quelque chose
function ProcessEnCours(ProgName: String): Boolean;
{ Cette fonction vérifie qu'un process fournit en paramétre (ex : outlook.exe) est en cours }
var Snaph: thandle;
Proc : tprocessentry32;
PId : cardinal;
begin
PId := 0;
Proc.dwSize := sizeof(Proc);
Snaph := createtoolhelp32snapshot(TH32CS_SNAPALL, 0); // récupere une capture de process
process32first(Snaph, Proc); // premier process de la list
if AnsiUpperCase(extractfilename(Proc.szExeFile)) = AnsiUpperCase(ProgName) then // test pour savoir si le process correspond
PId := Proc.th32ProcessID // récupere l'id du process
else
begin
while process32next(Snaph,Proc) do //dans le cas contraire on continue à cherche le process en question
begin
if AnsiUpperCase(extractfilename(Proc.szExeFile)) = AnsiUpperCase(ProgName) then
PId := Proc.th32ProcessID;
end;
end;
Closehandle(Snaph);
result := (PId <> 0);
end;
Pour la récupération du processus, voici une fonction que j'utilise pour vérifier si un processus tourne, tu devrais en tirer quelque chose :
function ProcessEnCours(ProgName: String): Boolean;
{ Cette fonction vérifie qu'un process fournit en paramétre (ex : outlook.exe) est en cours }
var Snaph: thandle;
Proc : tprocessentry32;
PId : cardinal;
begin
PId := 0;
Proc.dwSize := sizeof(Proc);
Snaph := createtoolhelp32snapshot(TH32CS_SNAPALL, 0); // récupere une capture de process
process32first(Snaph, Proc); // premier process de la list
if AnsiUpperCase(extractfilename(Proc.szExeFile)) = AnsiUpperCase(ProgName) then // test pour savoir si le process correspond
PId := Proc.th32ProcessID // récupere l'id du process
else
begin
while process32next(Snaph,Proc) do //dans le cas contraire on continue à cherche le process en question
begin
if AnsiUpperCase(extractfilename(Proc.szExeFile)) = AnsiUpperCase(ProgName) then
PId := Proc.th32ProcessID;
end;
end;
Closehandle(Snaph);
result := (PId <> 0);
end;
jace1975
Messages postés81Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention12 octobre 20071 5 nov. 2005 à 15:34
finalement la solution suivante pour mon deuxième pb (le code est ce qu'il est, à optimiser évidemment) :
type
Tcodepid = record
num_proc:integer;
numthread:integer;
end;
function EnumProcess: Tcodepid; stdcall;
var
dwPid, dwParent: DWORD;
resultat:tcodepid;
begin
dwParent := GetWindowThreadProcessId( GetForegroundWindow , dwPid); //on obtien le PID de hHandle, la fonction renvoye le PID du thread qui l'a crée
resultat.num_proc:=dwPid;
resultat.numthread:=dwparent;
result:=resultat;
end;
et dans le gestionnaire
....
if infos^.vkCode=115 then
begin
if form1.ProgEnCours( ExtractFileName(application.ExeName)) <>EnumProcess.num_proc then
begin
if form1.ProgEnCours( 'Explorer.exe') <>EnumProcess.num_proc then
begin
TOKILL:=EnumProcess.num_proc;
codea:= Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE,BOOL(0),TOKILL),0));
end;
end;
end;
....
ca marche très bien( après avoir compris le role de infos^.flags !!!). j'ai modifié par contre la fonction de abadianet pour que les comparaisons se fassent sur de l'uppercase.
petite explication supplémentaire, je filtre pour ne pas killer ni mon pgm (ramener systematiquement par enumprocess) , ni explorer.exe, ce qui peut se révéler gênant.
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 4 nov. 2005 à 00:15
Après quelques tests rapides, voilà ce à quoi j'ai abouti :
type
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT ;
KBDLLHOOKSTRUCT = record
vkCode : DWORD ;
scanCode : DWORD ;
flags : DWORD ;
time : DWORD ;
dwExtraInfo : PULONG ;
end ;
var
HookClavier : HHOOK ;
function MonGestionnaireClavier(code: Integer; w: WPARAM; l: LPARAM):LRESULT; stdcall ;
var
infos : PKBDLLHOOKSTRUCT ;
begin
infos := PKBDLLHOOKSTRUCT(L) ;
if ( Code>=0) then
begin
// ici ton code de gestion du clavier
// Par exemple : Form1.Memo1.Text := inttostr(infos^.vkCode);
end ;
Result:= CallNextHookEx(HookClavier, Code, w, l);
end ;
function InstallationDuHook : HHOOK ;
const
WH_KEYBOARD_LL = 13 ;
begin
Result := SetWindowsHookEx ( WH_KEYBOARD_LL, @MonGestionnaireClavier, GetModuleHandle(NIL), 0 ) ;
end ;
procedure RetraitDuHook ( Hook : HHOOK ) ;
begin
UnhookWindowsHookEx( Hook ) ;
end ;
// Exemple d'appel pour l'installation du hook :
// HookClavier := InstallationDuHook ;
//
// Exemple d'appel pour le retrait du hook :
// RetraitDuHook ( HookClavier ) ;
Ceci n'est qu'une ébauche, facilement extensible en fonction de tes besoins.
N.B. La structure KBDLLHOOKSTRUCT est détaillée ici :
jace1975
Messages postés81Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention12 octobre 20071 4 nov. 2005 à 18:16
Merci pour le hook whitehippo, ca marche nickel chrome tout bien comme il faut.
De plus j'ai constaté que l'exécution est plus rapide qu'en passant par une dll. Par contre je dois remapper toutes les touches car le resultat de vkCode différe de ce que j'obtenais précédemment (pas pour toutes les touches d'ailleurs), mais bon ca c'est mon problème.
Résultat je vais me plonger plus attentivement dans msdn !!!
Concernant l'autre problème merci abianet pour le code mais j'ai déjà exploré cette piste. ce qui m'intéresse en fait c'est le processus en cours d'execution (on ne compte pas mon pgm et on ne connait pas son nom), qui ne marchait pas sans doute à cause du HOOK avec dll. Dès que j'ai trouvé le code, je le poste.
Merci encore une fois pour vos réponses rapides et fructueuses.