โปรแกรมนี้ค้นหาและแสดงรายการรหัสของกระบวนการทั้งหมดยกเว้นกระบวนการนี้ในระบบตัวระบุไฟล์ที่สอดคล้องกันลำดับความสำคัญการแชร์ CPU จำนวนเธรดข้อมูลกระบวนการที่เกี่ยวข้อง ฯลฯ โดยการเรียกฟังก์ชั่น API หลายรายการใน Kernel32.dll กระบวนการที่เลือก
เมื่อโปรแกรมนี้กำลังทำงานไอคอนจะถูกเพิ่มในพื้นที่ถาดระบบจะไม่ปรากฏในรายการงานที่ปรากฏขึ้นเมื่อกด Ctrl+Alt+Del และปุ่มงานจะไม่ปรากฏบนแถบงานและจะเป็น ซ่อนไว้โดยอัตโนมัติเมื่อไม่ได้ใช้งานหรือย่อเล็กสุด มันจะไม่ทำงานซ้ำ ๆ
โปรแกรมนี้หลีกเลี่ยงวิธีการรันซ้ำของโปรแกรมค่อนข้างไม่ซ้ำกัน เนื่องจากหลังจากที่ฉันลองใช้วิธีการบางอย่างบนอินเทอร์เน็ตฉันพบว่าเมื่อโปรแกรมถูกเปิดใช้งานจากสถานะที่ย่อเล็กสุดแล้วหน้าต่างไม่สามารถย่อให้เล็กสุดได้เมื่อคลิกปุ่มลดหน้าต่าง ดังนั้นผู้เขียนจึงใช้วิธีการส่งและประมวลผลข้อความที่กำหนดเอง เมื่อโปรแกรมกำลังทำงานก่อนที่จะระบุ Windows ในระบบก่อน โปรแกรมรันจะแสดงหน้าต่างหลังจากได้รับข้อความที่กำหนดเอง
// ไฟล์โครงการ procviewpro.dpr
โปรแกรม ProcviewPro;
ใช้
แบบฟอร์ม, windows, ข้อความ, หลักใน 'procview.pas' {form1};
{$ r *.res}
-
// นี่เป็นระบบอัตโนมัติ
เริ่ม
Application.initialize;
Application.title: = 'การตรวจสอบกระบวนการระบบ';
application.createform (tform1, form1);
Application.run;
จบ.
-
วาจา
myhwnd: hwnd;
เริ่ม
myhwnd: = findwindow (ไม่มี 'การตรวจสอบกระบวนการระบบ');
หาก myhwnd = 0 จากนั้น // ไม่พบให้ทำงานต่อไป
เริ่ม
Application.initialize;
Application.title: = 'การตรวจสอบกระบวนการระบบ';
application.createform (tform1, form1);
Application.run;
จบ
Else // ค้นพบหน้าต่างส่งข้อความพื้นที่ถาดของเมาส์คลิกเมาส์เพื่อเปิดใช้งานหน้าต่าง
postmessage (myhwnd, wm_systraymsg, 0, wm_lbuttondown);
-
// ข้อเสียของวิธีการต่อไปนี้คือ: หากหน้าต่างนั้นอยู่ในสถานะที่เล็กที่สุดให้คลิกปุ่มย่อเล็กสุดหลังจากการเปิดใช้งานจะไม่ลดหน้าต่าง
showwindow (myhwnd, sw_restore);
Flashwindow (myhwnd, true);
-
จบ.
-
// ต่อไปนี้เป็นวิธีการใช้อะตอมทั่วโลกเพื่อหลีกเลี่ยงการรันโปรแกรมซ้ำ ๆ
const
Atomstr = 'Procview';
วาจา
อะตอม: จำนวนเต็ม;
เริ่ม
ถ้า GlobalFindatom (Atomstr) = 0 แล้ว
เริ่ม
อะตอม: = GlobalAdDatom (Atomstr);
กับแอปพลิเคชัน DO
เริ่ม
เริ่มต้น;
ชื่อเรื่อง: = 'การตรวจสอบกระบวนการระบบ';
createForm (tform1, form1);
วิ่ง;
จบ;
Globaldeleteatom (อะตอม);
จบ;
จบ.
-
// หน่วยไฟล์ procview.pas
Procview หน่วย;
ส่วนต่อประสาน
ใช้
Windows, ข้อความ, sysutils, คลาส, กราฟิก, การควบคุม, รูปแบบ, กล่องโต้ตอบ
stdctrls, tlhelp32, ปุ่ม, comctrls, extctrls, shellapi, myflag;
const
process_terminate = 0;
systray_id = 1;
WM_SYSTRAYMSG = WM_USER+100;
พิมพ์
tform1 = คลาส (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;
ขั้นตอน btnrefreshclick (ผู้ส่ง: t วัตถุ );
ขั้นตอน BTNDETERMINECLICK (ผู้ส่ง: T Object );
ขั้นตอน lvsysprocclick (ผู้ส่ง: t วัตถุ );
โพรซีเดอร์แบบฟอร์ม (ผู้ส่ง: t วัตถุ );
ขั้นตอน apponminimize (ผู้ส่ง: t วัตถุ );
Procedure FormClose (ผู้ส่ง: T Object ; VAR ACTION: TCLOSEACTION);
โพรซีเดอร์ FormDeactivate (ผู้ส่ง: T Object );
ขั้นตอน lblemailclick (ผู้ส่ง: t วัตถุ );
ขั้นตอนการกำหนดรูปแบบ (ผู้ส่ง: t วัตถุ );
ส่วนตัว
{ประกาศส่วนตัว}
Fshandle: Thandle;
formoldheight, formoldwidth: จำนวนเต็ม;
ขั้นตอน systray onclick (ข้อความ var: tmessage); ข้อความ wm_systraymsg;
สาธารณะ
{ประกาศสาธารณะ}
จบ;
วาจา
Form1: TFORM1;
idid: dword;
fp32: tprocessentry32;
FM32: tmoduleentry32;
Systrayicon: tnotifyicondata;
การดำเนินการ
{$ r *.dfm}
ฟังก์ชั่น RegistERSerViceProcess (dwprocessid, dwtype: จำนวนเต็ม): จำนวนเต็ม; stdcall; ภายนอก 'เคอร์เนล 32.dll';
โพรซีเดอร์ TFORM1.BTNREFRESCLICK (ผู้ส่ง: T Object );
วาจา
CLP: บูล;
newItem1: tlistitem;
Myicon: Ticon;
IconIndex: Word;
Procfile: Array [0..Max_Path] ของ Char;
เริ่ม
Myicon: = ticon.create;
lvsysproc.items.clear;
lvsysproc.smallimages.clear;
fshandle: = createToolhelp32snapshot (Th32cs_snapprocess, 0);
fp32.dwsize: = sizeof (fp32);
CLP: = process32first (fshandle, fp32);
IconIndex: = 0;
ในขณะที่จำนวนเต็ม (CLP) <> 0 ทำ
เริ่ม
ถ้า fp32.th32processid <> getCurrentProcessID แล้ว
เริ่ม
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: = extractociatedicon (Hinstance, procfile, iconindex);
ถ้า myicon.handle <> 0 แล้ว
เริ่ม
ด้วย lvsysproc do
เริ่ม
newItem1.imageIndex: = smallimages.addicon (Myicon);
จบ;
จบ;
ด้วย newItem1.subitems ทำ
เริ่ม
เพิ่ม (inttohex (fp32.th32processid, 4));
เพิ่ม (inttoHex (fp32.th32parentProcessid, 4));
เพิ่ม (inttoHex (fp32.pcpriclassbase, 4));
เพิ่ม (inttohex (fp32.cntusage, 4));
เพิ่ม (inttoStr (fp32.cntthreads));
จบ;
จบ;
CLP: = process32NEXT (fshandle, fp32);
จบ;
ภาพใกล้ชิด (fshandle);
lblcountsysproc.caption: = inttoStr (lvsysproc.items.count);
myicon.free;
จบ;
ขั้นตอน TFORM1.BTNDETERMINECLICK (ผู้ส่ง: T Object );
วาจา
Processhndle: Thandle;
เริ่ม
ด้วย lvsysproc do
เริ่ม
ถ้าเลือก = ไม่มี
เริ่ม
MessageBox (form1.handle, 'โปรดเลือกกระบวนการที่จะถูกยกเลิกก่อน!', 'การดำเนินการพรอมต์', mb_ok+mb_iconinformation);
จบ
อื่น
เริ่ม
ถ้า MessageBox (form1.handle, pchar ('สิ้นสุด'+itemfocused.caption+'?')
, 'ยุติกระบวนการ', mb_yesno+mb_iconwarning+mb_defbutton2) = mryes แล้ว
เริ่ม
idid: = strtoint ('$'+itemfocused.subitems [0]);
Processhndle: = OpenProcess (process_terminate, bool (0), idid);
ถ้าจำนวนเต็ม (สิ้นสุดการประมวลผล (processshndle, 0)) = 0 แล้ว
MessageBox (form1.handle, pchar ('ไม่สามารถยุติ'+itemfocused.caption+'!')
, 'การดำเนินการล้มเหลว', mb_ok+mb_ic onerror )
อื่น
เริ่ม
เลือกลบ;
lvaboutproc.items.clear;
lblcountsysproc.caption: = inttoStr (lvsysproc.items.count);
lblcountaboutproc.caption: = '';
จบ
จบ;
จบ;
จบ;
จบ;
โพรซีเดอร์ tform1.lvsysprocclick (ผู้ส่ง: t Object );
วาจา
newItem2: tlistItem;
CLP: บูล;
เริ่ม
ถ้า lvsysproc.Selected <> nil แล้ว
เริ่ม
idid: = strtoint ('$'+lvsysproc.itemfocused.subitems [0]);
lvaboutproc.items.clear;
fshandle: = createToolhelp32snapshot (Th32cs_snapmodule, idid);
fm32.dwsize: = sizeof (fm32);
CLP: = Module32FIRST (FSHANDLE, FM32);
ในขณะที่จำนวนเต็ม (CLP) <> 0 ทำ
เริ่ม
newItem2: = lvaboutproc.items.add;
ด้วย newItem2 ทำ
เริ่ม
คำบรรยายภาพ: = fm32.szeexepath;
ด้วย newItem2.subitems ทำ
เริ่ม
เพิ่ม (inttohex (fm32.th32moduleid, 4));
เพิ่ม (inttoHex (fm32.glblcntusage, 4));
เพิ่ม (inttoHex (fm32.proccntusage, 4));
จบ;
จบ;
CLP: = Module32NEXT (FSHANDLE, FM32);
จบ;
ภาพใกล้ชิด (fshandle);
lblcountaboutproc.caption: = inttoStr (lvaboutproc.items.count);
จบ
จบ;
โพรซีเดอร์ TFORM1.FormCreate (ผู้ส่ง: T Object );
เริ่ม
กับแอปพลิเคชัน DO
เริ่ม
showwindow (handle, sw_hide);
onminimize: = apponminimize;
ondeactivate: = formdeactivate;
onactivate: = btnrefreshclick;
จบ;
RegisterServiceProcess (getCurrentProcessID, 1);
ด้วย Systrayicon DO
เริ่ม
Cbsize: = sizeof (systrayicon);
wnd: = handle;
UID: = systray_id;
uflags: = nif_icon หรือ nif_message หรือ nif_tip;
UCALLBACKMESSAGE: = WM_SYSTRAYMSG;
hicon: = application.icon.handle;
SZTIP: = 'การตรวจสอบกระบวนการระบบ';
จบ;
shell_notifyicon (nim_add,@systrayicon);
ด้วย lvsysproc do
เริ่ม
SmallImages: = Timagelist.createSize (16,16);
smallImages.shareimages: = true;
จบ;
FormoldWidth: = self.width;
formoldheight: = self.height;
จบ;
// มันถูกซ่อนโดยอัตโนมัติเมื่อย่อเล็กสุด
ขั้นตอน tform1.apponminimize (ผู้ส่ง: t วัตถุ );
เริ่ม
showwindow (application.handle, sw_hide);
จบ;
// ตอบสนองเมาส์เพื่อคลิกที่ไอคอนพื้นที่ถาดระบบ
ขั้นตอน tform1.systray onclick (ข้อความ var: tmessage);
เริ่ม
ด้วยข้อความทำ
เริ่ม
ถ้า (lParam = WM_LBUTTONDOWN) หรือ (lParam = WM_RBUTTONDOWN) แล้ว
เริ่ม
Application.restore;
SetforeGroundWindow (ด้ามจับ);
showwindow (application.handle, sw_hide);
จบ;
จบ;
จบ;
โพรซีเดอร์ TFORM1.FormClose (ผู้ส่ง: T Object ; VAR ACTION: TCLOSEACTION);
เริ่ม
shell_notifyicon (nim_delete,@systrayicon);
RegisterServiceProcess (getCurrentProcessID, 0);
lvsysproc.smallimages.free;
จบ;
// มันจะซ่อนโดยอัตโนมัติเมื่อไม่ได้ใช้งาน
โพรซีเดอร์ TFORM1.FormDeactivate (ผู้ส่ง: T Object );
เริ่ม
Application.minimize;
จบ;
ขั้นตอน tform1.lblemailclick (ผู้ส่ง: t Object );
เริ่ม
ถ้า Shellexecute (Handle, 'Open', Pchar ('Mailto: [email protected]'), nil, nil, sw_show) <33 แล้ว
MessageBox (form1.handle, 'ไม่สามารถเริ่มซอฟต์แวร์อีเมล!', 'ฉันขอโทษ', mb_iconinformation+mb_ok);
จบ;
// ปรับตำแหน่งของแต่ละองค์ประกอบเมื่อขนาดของฟอร์มเปลี่ยนไป
โพรซีเดอร์ TFORM1.FormResize (ผู้ส่ง: T Object );
เริ่ม
ด้วย Panel1 Do Top: = Top+Self.height-Formoldheight;
ด้วย lvsysproc do
เริ่ม
ความกว้าง: = ความกว้าง+self.width-forodwidth;
จบ;
ด้วย lvaboutproc do
เริ่ม
ความสูง: = ความสูง+self.height-formoldheight;
ความกว้าง: = ความกว้าง+self.width-formoldwidth;
จบ;
FormoldWidth: = self.width;
formoldheight: = self.height;
จบ;
จบ.
โปรแกรมข้างต้นสามารถรวบรวมและทำงานได้ตามปกติใน Delphi 2, Windows 95 เวอร์ชันภาษาจีน, Delphi 5 และเวอร์ชันภาษาจีน Windows 97 หากคุณมีคำถามใด ๆ โปรดส่งอีเมลไปที่: [email protected] เพื่อพูดคุยกับฉัน
Postscript:
ในรหัสข้างต้น RegisterServiceProcess () เป็นฟังก์ชัน API ที่ไม่ได้เผยแพร่ซึ่งมีอยู่ใน Win 9X เท่านั้น
หลังจากเรียนรู้ MASM32 ฉันเขียนใหม่และปรับปรุงโปรแกรมนี้ด้วย MASM32
เพื่อนที่สนใจสามารถดาวน์โหลดเวอร์ชันล่าสุด:
http://www.hcny.gov.cn/netres/download/procview.rar