Ce programme recherche et répertorie les ID de tous les processus, à l'exception de ce processus dans le système, des spécificateurs de fichiers correspondants, de la priorité, du partage du processeur, du nombre de threads, des informations de processus connexes, etc. En appelant plusieurs fonctions API dans Kernel32.dll. le processus sélectionné.
Lorsque ce programme sera en cours d'exécution, une icône sera ajoutée dans la zone du plateau système, elle n'apparaîtra pas dans la liste de tâches qui apparaît lors de l'appuyer sur Ctrl + Alt + Del, et le bouton de tâche ne sera pas affiché sur la barre des tâches, et ce sera Caché automatiquement lorsqu'il est inactif ou minimisé. Il ne s'exécutera pas à plusieurs reprises.
Ce programme évite les méthodes de fonctionnement répétées des programmes est tout à fait unique. Parce qu'après avoir essayé certaines méthodes sur Internet, j'ai constaté que lorsque le programme était activé à partir de l'état minimisée, la fenêtre n'a pas pu être minimisée lors du clic sur la fenêtre Minimiser le bouton. L'auteur adopte donc la méthode d'envoi et de traitement des messages personnalisés. Lorsque le programme est en cours d'exécution, énumérez d'abord les fenêtres du système. Le programme en cours d'exécution affiche une fenêtre après avoir reçu le message personnalisé.
// Fichier de projet procViewpro.dpr
Programme ProcViewPro;
usages
Formulaires, fenêtres, messages, main dans 'procView.pas' {form1};
{$ R * .res}
{
// Ceci est automatique par le système
Commencer
application.Initialize;
Application.title: = 'System Process Showerling';
Application.CreateForm (TForm1, Form1);
Application.run;
fin.
}
var
myhwnd: hwnd;
Commencer
myhwnd: = findwindow (nil, «surveillance du processus système»);
Si myhwnd = 0 alors // non trouvé, continuez à courir
Commencer
Application.Initialize;
Application.title: = 'System Process Showerling';
Application.CreateForm (TForm1, Form1);
Application.run;
fin
else // Découvrez la fenêtre, envoyez le message de la zone du plateau de clic de souris pour activer la fenêtre
PostMessage (Myhwnd, WM_SYSTRAYMSG, 0, WM_LBUTTONDOWN);
{
// L'inconvénient de la méthode suivante est: si la fenêtre était à l'origine à un état minimisée, en cliquant sur le bouton Minimiser la fenêtre après l'activation ne minimisera pas la fenêtre.
showwindow (myhwnd, sw_restore);
Flashwindow (myhwnd, true);
}
fin.
{
// Ce qui suit est une méthode pour utiliser les atomes globaux pour éviter le fonctionnement répété de programmes
const
atomstr = 'procView';
var
Atome: entier;
Commencer
Si globalFindatom (atomstr) = 0 alors
Commencer
Atom: = GlobalAdDatom (ATOMSTR);
avec application faire
Commencer
Initialiser;
Titre: = 'System Process Surgitring';
CreateForm (TForm1, Form1);
Courir;
fin;
GlobaldeleTeate (atome);
fin;
fin.
}
// Fichier unitaire ProcView.pas
unité procView;
interface
usages
Windows, messages, systèmes, classes, graphiques, contrôles, formulaires, dialogues,
Stdctrls, tlhelp32, boutons, comctrls, extctrls, shellapi, myflag;
const
Process_termiate = 0;
Systray_id = 1;
WM_SYSTRAYMSG = WM_USER + 100;
taper
Tform1 = classe (tform)
lvsysproc: tlistview;
lblsysproc: tlabel;
lblaboutproc: tlabel;
lvaboutProc: tlistView;
LBLCOUNTSYSPROC: TLABEL;
lblCountaboutProc: tlabel;
Panel1: Tpanel;
Btndetermine: Tbutton;
BtnRefresh: Tbutton;
LBLOTERS: Tlabel;
LLEBLEMAIL: TLABEL;
Myflag1: tmyflag;
Procédure btnrefreshClick (expéditeur: objet T);
Procédure btndeterMineClick (expéditeur: objet T);
Procédure lvSysProcClick (expéditeur: objet T);
Procédure FormCreate (Sender: T objet );
Procédure ApponMinIMIZE (Sender: T objet );
Procédure FormClose (expéditeur: objet T; Action VAR: TCLOSEACTION);
procédure formdeActivate (Sender: T objet );
Procédure lblemailclick (expéditeur: objet T);
Procédure FormResize (Sender: T objet );
Privé
{Déclarations privées}
fshandle: thandle;
FormoldHeight, FormoldWidth: entier;
Procédure systray onClick (var message: tMessage); message wm_systraymsg;
publique
{Déclarations publiques}
fin;
var
FORM1: TFORM1;
idid: dword;
fp32: tprocesssentry32;
FM32: TmoduleEntry32;
SYSTRAYICON: TnotifyIcondata;
Mise en œuvre
{$ R * .dfm}
Fonction RegisterserviceProcess (dwprocessId, dwtype: entier): entier; stdcall; externe 'kernel32.dll';
Procédure tform1.btnrefreshClick (expéditeur: objet T);
var
CLP: bool;
NewItem1: tListItem;
Myicon: Ticon;
IconIndex: mot;
ProcFile: Array [0..max_path] de char;
Commencer
Myicon: = Ticon.Create;
lvsysproc.items.clear;
lvsysproc.smallimages.clear;
fshandle: = createToolHelp32SnapShot (th32cs_snapprocess, 0);
fp32.dwsize: = sizeof (fp32);
Clp: = process32First (fshandle, fp32);
IconIndex: = 0;
tandis que entier (CLP) <> 0 do
Commencer
Si fp32.th32processsid <> getCurrentProcesssid alors
Commencer
NewItem1: = lvSysProc.Items.Add;
{
newItem1.caption: = fp32.szexeFile;
Myicon.handle: = extracticon (form1.handle, fp32.szexeFile, 0);
}
StrCopy (Profile, fp32.szexefile);
newItem1.caption: = procFile;
MyIcon.Handle: = ExtractAssociatedICon (hinstance, procFile, iconIndex);
Si myicon.handle <> 0 alors
Commencer
avec lvsysproc faire
Commencer
NewItem1.imageIndex: = stemImages.Addicon (MyIcon);
fin;
fin;
avec NewItem1.Subitems
Commencer
Add (intoHex (fp32.th32ProcessId, 4));
Add (intohex (fp32.th32parentProcessId, 4));
Add (intohex (fp32.pcpriclassbase, 4));
Add (intohex (fp32.cntUsage, 4));
Add (inttoStr (fp32.cntThreads));
fin;
fin;
Clp: = process32Next (fshandle, fp32);
fin;
Closehandle (fshandle);
lblCountsysProc.caption: = intToStr (lvSysProc.Items.Count);
Myicon.Free;
fin;
Procédure tform1.btndeterMineClick (Sender: T objet );
var
Processhndle: Thandle;
Commencer
avec lvsysproc faire
Commencer
Si sélectionné = nil alors
Commencer
MessageBox (form1.handle, «Veuillez sélectionner le processus à terminer d'abord!», «Invite de l'opération», MB_OK + MB_ICONInformation);
fin
autre
Commencer
Si messagebox (form1.handle, phar ('terminer' + itemfocused.caption + '?')
, 'Terminer le processus', MB_YESNO + MB_ICONWARNING + MB_DEFBUTTON2) = MRYES
Commencer
iDID: = strToint ('$' + itemfocused.subitems [0]);
processHndle: = openProcess (process_terminate, bool (0), iDID);
Si entier (terminalProcess (processShndle, 0)) = 0 alors
MessageBox (form1.handle, pChar ('Impossible de terminer' + itemfocused.caption + '!')
, «Opération Échec», MB_OK + MB_IC ONERROR )
autre
Commencer
Sélectionné.delete;
lvaboutproc.items.clear;
lblCountsysProc.caption: = intToStr (lvSysProc.Items.Count);
lblCountAboutProc.caption: = '';
fin
fin;
fin;
fin;
fin;
Procédure TForm1.lvSysProcClick (Sender: T objet );
var
NewItem2: tListItem;
CLP: bool;
Commencer
Si lvsysproc.selected <> nil alors
Commencer
iDID: = strToint ('$' + lvsysproc.itemfocus.subitems [0]);
lvaboutproc.items.clear;
fshandle: = createToolHelp32Snapshot (th32cs_snapmodule, idid);
fm32.dwsize: = sizeof (fm32);
CLP: = module32First (fshandle, fm32);
tandis que entier (CLP) <> 0 do
Commencer
NewItem2: = lvaboutProc.items.add;
avec NewItem2 faire
Commencer
Légende: = FM32.SZEEXEPATH;
avec NewItem2. Subitems font
Commencer
Add (intoHex (fm32.th32moduleid, 4));
Add (intoHex (fm32.glblcntUsage, 4));
Add (intoHex (FM32.ProccntUsage, 4));
fin;
fin;
Clp: = module32Next (fshandle, fm32);
fin;
Closehandle (fshandle);
lblCountAboutProc.caption: = intToStr (lvaboutProc.Items.Count);
fin
fin;
Procédure tform1.formCreate (Sender: T objet );
Commencer
avec application faire
Commencer
showwindow (manche, sw_hide);
Onminimize: = apponminimize;
OndeActivate: = formdeActivate;
Onactivate: = btnRefreshClick;
fin;
RegisterserviceProcess (GetCurrentProcessId, 1);
avec systrayicon faire
Commencer
cbSize: = sizeof (systrayicon);
wnd: = manche;
uid: = systray_id;
uflags: = nif_icon ou nif_message ou nif_tip;
ucallbackMessage: = wm_systraymsg;
HICON: = Application.Icon.Handle;
sztip: = 'System Process Showerling';
fin;
Shell_notifyicon (NIM_ADD, @ systrayicon);
avec lvsysproc faire
Commencer
Smallimages: = timageList.CreateSize (16,16);
SmallImages.shareImages: = true;
fin;
FormoldWidth: = self.width;
FormoldHeight: = self.height;
fin;
// il est automatiquement caché lorsqu'il est minimisé
Procédure TForm1.ApponMinIMIZE (Sender: T objet );
Commencer
Showwindow (application.handle, sw_hide);
fin;
// Répondez la souris à cliquer sur l'icône de la zone du plateau système
Procédure TForm1.Systray OnClick (VAR Message: TMessage);
Commencer
avec un message faire
Commencer
if (lparam = wm_lbuttondown) ou (lparam = wm_rbuttondown) alors
Commencer
application.Restore;
SetforegroundWindow (manche);
showwindow (application.handle, sw_hide);
fin;
fin;
fin;
Procédure tform1.formClose (expéditeur: objet T; Action VAR: TcloseAction);
Commencer
Shell_notifyicon (nim_delete, @ systrayicon);
RegisterserviceProcess (GetCurrentProcessId, 0);
lvsysproc.smallimages.free;
fin;
// il se cachera automatiquement lorsqu'il est inactif
Procédure tform1.formDeActivate (Sender: T objet );
Commencer
application.minimize;
fin;
Procédure tform1.LBLEBLailClick (expéditeur: objet T);
Commencer
Si Shellexcute (manche, «ouvert», phar ('Mailto: [email protected]'), nil, nil, sw_show) <33 alors
MessageBox (form1.handle, «Impossible de démarrer le logiciel de messagerie!», «Je suis désolé», MB_ICONInformation + MB_OK);
fin;
// ajuster la position de chaque composant lorsque la taille du formulaire change
Procédure tform1.formResize (Sender: T objet );
Commencer
avec Pannel1 do top: = top + self.height-formoldHeight;
avec lvsysproc faire
Commencer
Largeur: = largeur + self.width-formoldWidth;
fin;
avec lvaboutproc faire
Commencer
Hauteur: = hauteur + self.Height-FormoldHeight;
Largeur: = largeur + self.width-formoldWidth;
fin;
FormoldWidth: = self.width;
FormoldHeight: = self.height;
fin;
fin.
Les programmes ci-dessus peuvent être compilés et s'exécuter normalement dans la version chinoise de Delphi 2, Windows 95, Delphi 5 et Windows 97. Si vous avez des questions, veuillez envoyer un courriel à: [email protected] pour discuter avec moi.
PostScript:
Dans le code ci-dessus, RegisterserviceProcess () est une fonction API non publiée qui n'existe que dans Win 9x.
Après avoir appris MASM32, j'ai réécrit et amélioré ce programme avec MASM32
Les amis intéressés peuvent télécharger la dernière version:
http://www.hcny.gov.cn/netres/download/procview.rar