Fermer groupe de programme avec une touche

Description

Pour des raisons pratiques dans certains cas...
Voici un petit programme qui permet de killer un ensemble de programme par l'appui d'une touche que vous pouvez configurer.

C'est beaucoup plus rapide de fermer IE en appuyant sur une touche que d'attraper sa souris pour viser la petite croix.

Par défaut :
Appuyez 3 fois sur * (pavé numérique) pour lancer la config du programme
Appuyez 2 fois sur - pour killer Internet Explorer

Modifier NbAppuis et NbAppuisConfig pour choisir combien de fois appuyer pour lancer l'action

Source / Exemple :


unit Unit1;

  {Par défaut :                                   
   Appuyez 3 fois sur * (pavé numérique) pour lancer la config du programme
   Appuyez 2 fois sur - pour killer Internet Explorer
   Modifier NbAppuis et NbAppuisConfig pour choisir combien de fois appuyer pour lancer l'action }

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Buttons, TlHelp32, ButtonWST ;

const
  NbAppuis = 2;
  NbAppuisConfig = 3;

type

  TForm1 = class(TForm)
    TimRazTouches: TTimer;
    TimDetectTouches: TTimer;
    Label1: TLabel;
    ediProcessus1: TEdit;
    Label2: TLabel;
    ediTouche: TEdit;
    ediProcessus2: TEdit;
    ediProcessus3: TEdit;
    ediProcessus4: TEdit;
    ediProcessus5: TEdit;                               
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    procedure TimRazTouchesTimer(Sender: TObject);
    procedure TimDetectTouchesTimer(Sender: TObject);
    procedure ediToucheKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure SpeedButton2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
  private
    { Déclarations privées }
    Touches : array [1..NbAppuis * 2] of Integer;
    TouchesConfig : array [1..NbAppuisConfig * 2] of Integer;
    Touche: Integer;

    procedure AjouterTouche(const Valeur: Integer; var TouchesLoc : array of Integer);
  public
    { Déclarations publiques }
  end;                        

var
  Form1: TForm1;
  PasEncoreCachee: Boolean = True;

implementation

{$R *.dfm}
procedure TForm1.AjouterTouche(const Valeur: Integer; var TouchesLoc : array of Integer);
var i: Integer;
begin
  for i:= 0 to High(TouchesLoc) do
  begin
    if (TouchesLoc[i] = 0) then
    begin
      if (i = 0) or (TouchesLoc[i - 1] <> Valeur) then
      begin
        TouchesLoc[i]:= Valeur;
        TimRazTouches.Enabled:= False;
        TimRazTouches.Enabled:= True;
      end;
      Break;
    end;
  end;
end;

procedure TForm1.TimRazTouchesTimer(Sender: TObject);
begin
  FillChar(Touches, SizeOf(Touches), 0);
  FillChar(TouchesConfig, SizeOf(TouchesConfig), 0);
end;

function KillProcess(const ProcessName : string) : boolean;
var ProcessEntry32 : TProcessEntry32;
    HSnapShot : THandle;
    HProcess : THandle;
begin
  Result := False;
  HSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if HSnapShot = 0 then Exit;
  ProcessEntry32.dwSize := sizeof(ProcessEntry32);
  if Process32First(HSnapShot, ProcessEntry32) then
  repeat
    if CompareText(ProcessEntry32.szExeFile, ProcessName) = 0 then
    begin
      HProcess := OpenProcess(PROCESS_TERMINATE, False, ProcessEntry32.th32ProcessID);
      if HProcess <> 0 then
      begin
        Result := TerminateProcess(HProcess, 0);
        CloseHandle(HProcess);
      end;
      Break;
    end;
  until not Process32Next(HSnapShot, ProcessEntry32);
  CloseHandle(HSnapshot);
end;

procedure TForm1.TimDetectTouchesTimer(Sender: TObject);
begin
  if PasEncoreCachee then
    Visible:= False; //ShowWindow(Form1.Handle ,SW_HIDE);

  PasEncoreCachee:= False;
  if (GetKeyState(Touche) <> 0) and (GetKeyState(Touche) <> 1) then
  begin
    AjouterTouche(1, Touches);
    if Touches[High(Touches)] <> 0 then
    begin
      FillChar(Touches, SizeOf(Touches), 0);
      if ediProcessus1.Text <> '' then
        KillProcess(ediProcessus1.Text);
      if ediProcessus2.Text <> '' then
        KillProcess(ediProcessus2.Text);
      if ediProcessus3.Text <> '' then
        KillProcess(ediProcessus3.Text);
      if ediProcessus4.Text <> '' then
        KillProcess(ediProcessus4.Text);
      if ediProcessus5.Text <> '' then
        KillProcess(ediProcessus5.Text);
    end;
  end
  else
    AjouterTouche(2, Touches);

  if (GetKeyState(VK_MULTIPLY) <> 0) and (GetKeyState(VK_MULTIPLY) <> 1) then
  begin
    AjouterTouche(1, TouchesConfig);
    if TouchesConfig[High(TouchesConfig)] <> 0 then
    begin
      FillChar(TouchesConfig, SizeOf(TouchesConfig), 0);
      Visible:= True;
    end;
  end
  else
    AjouterTouche(2, TouchesConfig);
end;

procedure TForm1.ediToucheKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  ediTouche.Text:= IntToStr(Key);
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
  Visible:= False;
  Touche:= StrToInt(ediTouche.Text);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Touche:= 109;
  ediTouche.Text:= IntToStr(Touche);
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  MessageDlg('Hugo Bulthé : hugo.bulthe@free.fr'+#13#10#13#10+'Pour être tranquille au bureau :-)'+#13#10#13#10+'Renseignez le nom des processus à killer.'+#13#10+'Pour changer la touche qui lance l''action, placez-vous dans la zone code touche et appuyez sur une touche.'+#13#10#13#10+'Pour killer tous les processus renseignés, appuyez plusieurs fois sur la touche configurée.', mtInformation, [mbOK], 0);
end;

end.

Conclusion :


Le code n'est pas super optimisé mais bon ça suffit amplement.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.