Program ini mencari dan mencantumkan ID dari semua proses kecuali proses ini dalam sistem, penentu file yang sesuai, prioritas, saham CPU, jumlah utas, informasi proses terkait, dll. Dengan memanggil beberapa fungsi API di Kernel32.dll. proses yang dipilih.
Saat program ini berjalan, ikon akan ditambahkan di area baki sistem, itu tidak akan muncul dalam daftar tugas yang muncul saat menekan Ctrl+Alt+del, juga tidak akan ditampilkan di TaskBar, dan itu akan terjadi secara otomatis disembunyikan saat tidak aktif atau diminimalkan. Itu tidak akan berjalan berulang kali.
Program ini menghindari metode menjalankan program yang berulang cukup unik. Karena setelah saya mencoba beberapa metode di internet, saya menemukan bahwa ketika program diaktifkan dari keadaan yang diminimalkan, jendela tidak dapat diminimalkan saat mengklik tombol meminimalkan jendela. Jadi penulis mengadopsi metode mengirim dan memproses pesan khusus. Saat program sedang berjalan, pertama -tama sebutkan Windows di sistem. Program yang sedang berjalan menampilkan jendela setelah menerima pesan khusus.
// file proyek procviewpro.dpr
Program ProcviewPro;
penggunaan
Formulir, windows, pesan, utama di 'procview.pas' {form1};
{$ R *.res}
{
// Ini otomatis oleh sistem
Mulai
application.Initialize;
Application.title: = 'pemantauan proses sistem';
Application.createForm (tform1, form1);
Application.run;
akhir.
}
var
myhwnd: hwnd;
Mulai
myhwnd: = findWindow (nil, 'pemantauan proses sistem');
Jika myhwnd = 0 lalu // tidak ditemukan, lanjutkan berlari
Mulai
Application.Initialize;
Application.title: = 'pemantauan proses sistem';
Application.createForm (tform1, form1);
Application.run;
akhir
else // temukan jendela, kirim pesan Area Baki Sistem Klik Mouse untuk mengaktifkan jendela
postmessage (myhwnd, wm_systraymsg, 0, wm_lbuttondown);
{
// Kerugian dari metode berikut adalah: Jika jendela awalnya dalam keadaan yang diminimalkan, mengklik tombol Minimalkan jendela setelah aktivasi tidak akan meminimalkan jendela.
showwindow (myhwnd, sw_restore);
Flashwindow (myhwnd, true);
}
akhir.
{
// Berikut ini adalah metode untuk menggunakan atom global untuk menghindari menjalankan program berulang
const
atomstr = 'procview';
var
Atom: Integer;
Mulai
Jika GlobalFindatom (AtomStr) = 0 lalu
Mulai
Atom: = GlobalAddatom (AtomStr);
dengan aplikasi lakukan
Mulai
Inisialisasi;
Judul: = 'Pemantauan Proses Sistem';
CreateForm (tform1, form1);
Berlari;
akhir;
Globaldeleteatom (Atom);
akhir;
akhir.
}
// file unit procview.pas
Prokview unit;
antarmuka
penggunaan
Windows, pesan, sysutils, kelas, grafik, kontrol, formulir, dialog,
Stdctrls, tlhelp32, tombol, comctrls, extctrls, shellapi, myflag;
const
Proses_Terminate = 0;
Systray_id = 1;
Wm_systraymsg = wm_user+100;
jenis
Tform1 = class (tform)
lvsysproc: tListView;
lblsysproc: tlabel;
lblaboutproc: tlabel;
LVABOUTPROC: TListView;
lblcountsysproc: tlabel;
lblcountaboutproc: tlabel;
Panel1: tpanel;
btndetermine: tbutton;
Btnrefresh: tbutton;
lblothers: tlabel;
lblemail: tlabel;
Myflag1: tmyflag;
Prosedur BtnrefreshChclick (pengirim: T objek );
Prosedur btndetermineClick (pengirim: t objek );
Prosedur lvsysprocclick (pengirim: t objek );
Prosedur FormCreate (pengirim: T objek );
Prosedur ApponMinimize (pengirim: T objek );
Prosedur formclose (pengirim: T objek ; var Tindakan: tcloseaction);
Prosedur FormDeActivate (pengirim: T objek );
Prosedur lblemailClick (pengirim: T objek );
Prosedur FormResize (pengirim: T objek );
Pribadi
{Deklarasi Pribadi}
fshandle: Thandle;
FormoldHeight, FormoldWidth: Integer;
Prosedur Systray OnClick (pesan Var: tMessage); pesan wm_systraymsg;
publik
{Deklarasi Publik}
akhir;
var
Form1: tform1;
IDID: DWORD;
FP32: tProcessEntry32;
FM32: tmoduleentry32;
Systrayicon: tnotifyicondata;
Pelaksanaan
{$ R *.dfm}
fungsi registerserviceprocess (dwprocessid, dwtype: integer): integer; stdcall; eksternal 'kernel32.dll';
Prosedur TFORM1.BTNREFRESHCLICK (Pengirim: T objek );
var
CLP: bool;
newitem1: tlistitem;
Myicon: Ticon;
IconIndex: Word;
Procfile: array [0..max_path] dari char;
Mulai
Myicon: = ticon.create;
lvsysproc.items.clear;
lvsysproc.smallimages.clear;
fshandle: = createToolHelp32snapshot (th32cs_snapprocess, 0);
fp32.dwsize: = sizeof (fp32);
CLP: = Process32First (fshandle, FP32);
IconIndex: = 0;
Sedangkan integer (CLP) <> 0 do
Mulai
jika fp32.th32processid <> getCurrentProcessId maka
Mulai
newItem1: = lvsysproc.items.add;
{
newitem1.caption: = fp32.szexefile;
Myicon.handle: = Extracticon (form1.handle, fp32.szexefile, 0);
}
Strcopy (procfile, fp32.szexefile);
newitem1.caption: = procfile;
Myicon.handle: = ExtractAssociatiedicon (Hinstance, Procfile, IconIndex);
Jika myicon.handle <> 0 lalu
Mulai
dengan LVSySproc lakukan
Mulai
Newitem1.imageIndex: = Smallimage.addicon (myicon);
akhir;
akhir;
dengan newitem1.subitems lakukan
Mulai
add (inttOHex (fp32.th32processid, 4));
Add (inttHoHex (fp32.th32parentprocessid, 4));
Add (inttHOhex (fp32.pcpriclassbase, 4));
Add (inttHoHex (fp32.cntusage, 4));
Add (inttoStr (fp32.cntthreads));
akhir;
akhir;
CLP: = Process32Next (fshandle, FP32);
akhir;
CloseHandle (fshandle);
lblcountsysproc.caption: = inttoStr (lvsysproc.items.count);
Myicon.Free;
akhir;
Prosedur TFORM1.BTNDETERMINECLICK (pengirim: T objek );
var
ProcessHndle: Thandle;
Mulai
dengan LVSySproc lakukan
Mulai
Jika dipilih = nihil maka
Mulai
MessageBox (Form1.handle, 'Silakan pilih proses yang akan diakhiri terlebih dahulu!', 'Prompt Operasi', MB_OK+MB_ICONINFORMASI);
akhir
kalau tidak
Mulai
Jika MessageBox (Form1.Handle, PCHAR ('Terakhir'+ItemFocused.Caption+'?')
, 'Proses Aktifkan', mb_yesno+mb_iconwarning+mb_defbutton2) = mryes kemudian
Mulai
IDID: = strtoint ('$'+itemFocused.subitems [0]);
ProcessHndle: = OpenProcess (Process_Terminate, Bool (0), IDID);
jika bilangan bulat (terminateProcess (prosesshndle, 0)) = 0 lalu
MessageBox (form1.handle, pchar ('tidak dapat mengakhiri'+itemfocused.caption+'!')
, 'Operasi Gagal', MB_OK+MB_IC Onerror )
kalau tidak
Mulai
Dipilih.delete;
lvaboutproc.items.clear;
lblcountsysproc.caption: = inttoStr (lvsysproc.items.count);
lblcountaboutproc.caption: = '';
akhir
akhir;
akhir;
akhir;
akhir;
Prosedur TFORM1.LVSYSPROCCLICK (Pengirim: T objek );
var
newitem2: tlistitem;
CLP: bool;
Mulai
jika lvsysproc.pelected <> nil maka
Mulai
IDID: = strtoint ('$'+lvsysproc.itemfocused.subitems [0]);
lvaboutproc.items.clear;
fshandle: = createToolHelp32snapshot (th32cs_snapmodule, idid);
fm32.dwsize: = sizeof (fm32);
CLP: = MODULE32FIRST (FSHANDLE, FM32);
Sedangkan integer (CLP) <> 0 do
Mulai
newitem2: = lvaboutproc.items.add;
dengan newitem2 lakukan
Mulai
Keterangan: = fm32.szeexepath;
dengan newitem2.subitems lakukan
Mulai
Tambah (inttHoHex (FM32.TH32ModuleID, 4));
add (inttHoHex (fm32.glblcntusage, 4));
add (inttHoHex (fm32.proccntusage, 4));
akhir;
akhir;
CLP: = MODULE32NEXT (fshandle, FM32);
akhir;
CloseHandle (fshandle);
lblcountaboutproc.caption: = inttoStr (lvaboutproc.items.count);
akhir
akhir;
Prosedur tForm1.FormCreate (pengirim: T objek );
Mulai
dengan aplikasi lakukan
Mulai
ShowWindow (pegangan, SW_HIDE);
Onminimize: = ApponMinimize;
Ondeactivate: = FormDeactivate; // Secara otomatis bersembunyi saat tidak aktif
Onactivate: = btnrefreshChclick;
akhir;
RegisterServiceProcess (GetCurrentProcessId, 1);
dengan Systrayicon Do
Mulai
CBSIZE: = sizeof (Systrayicon);
WND: = pegangan;
uid: = systray_id;
uflags: = nif_icon atau nif_message atau nif_tip;
ucallbackMessage: = wm_systraymsg;
hicon: = application.icon.handle;
sztip: = 'pemantauan proses sistem';
akhir;
Shell_notifyicon (nim_add,@systrayicon);
dengan LVSySproc lakukan
Mulai
Sedikit: = timagelist.createsize (16,16);
Smallimages.ShareImages: = true;
akhir;
FormoldWidth: = self.width;
FormoldHeight: = self.height;
akhir;
// Ini secara otomatis disembunyikan saat diminimalkan
Prosedur TFORM1.ApponMinimize (pengirim: T objek );
Mulai
Showwindow (application.handle, sw_hide);
akhir;
// Respons mouse untuk mengklik ikon area baki sistem
Prosedur TForm1.Systray OnClick (Pesan Var: TMessage);
Mulai
dengan pesan lakukan
Mulai
if (lparam = wm_lbuttondown) atau (lparam = wm_rbuttondown) kemudian
Mulai
Application.Restore;
SetForegroundWindow (pegangan);
showwindow (application.handle, sw_hide);
akhir;
akhir;
akhir;
Prosedur TFORM1.FormClose (pengirim: T objek ; var Tindakan: tcloseaction);
Mulai
Shell_notifyicon (nim_delete,@systrayicon);
RegisterServiceProcess (GetCurrentProcessId, 0);
lvsysproc.smallimages.free;
akhir;
// itu akan bersembunyi secara otomatis saat tidak aktif
Prosedur TForm1.FormDeActivate (pengirim: T objek );
Mulai
application.minimize;
akhir;
Prosedur TFORM1.LBLEMAILCLICK (Pengirim: T objek );
Mulai
Jika Shellexecute (handle, 'open', pchar ('mailto: [email protected]'), nil, nil, sw_show) <33 lalu
MessageBox (Form1.handle, 'tidak dapat memulai perangkat lunak email!', 'Maaf', MB_IConinformation+MB_OK);
akhir;
// Sesuaikan posisi setiap komponen saat ukuran bentuk berubah
Prosedur TFORM1.FormResize (pengirim: T objek );
Mulai
dengan panel1 do top: = top+self.height-formoldHeight;
dengan LVSySproc lakukan
Mulai
lebar: = lebar+self.width-formoldwidth;
akhir;
dengan LVABOUTPROC DO
Mulai
Tinggi: = Tinggi+Self.Height-FormoldHeight;
lebar: = lebar+self.width-formoldwidth;
akhir;
FormoldWidth: = self.width;
FormoldHeight: = self.height;
akhir;
akhir.
Program -program di atas dapat dikompilasi dan dijalankan secara normal di Delphi 2, versi China Windows 95, Delphi 5, dan versi China Windows 97. Jika Anda memiliki pertanyaan, silakan email ke: [email protected] untuk berdiskusi dengan saya.
nota bene:
Dalam kode di atas, registerserviceProcess () adalah fungsi API yang tidak dipublikasikan yang hanya ada di WIN 9X.
Setelah belajar MASM32, saya menulis ulang dan meningkatkan program ini dengan MASM32
Teman yang tertarik dapat mengunduh versi terbaru:
http://www.hcny.gov.cn/netres/download/procview.rar