Эта программа ищет и перечисляет идентификаторы всех процессов, за исключением этого процесса в системе, соответствующие спецификаторы файлов, приоритет, общий центр процессора, количество потоков, связанная информация о процессе и т. Д., Вызывая несколько функций API в Kernel32.dll. Выбранный процесс.
Когда эта программа будет запущена, значок будет добавлен в системный лоток, он не будет отображаться в списке задач, который появляется при нажатии Ctrl+Alt+Del, и при этом кнопка задачи будет отображаться на панели задач, и это будет автоматически скрыт, когда неактивен или минимизирован. Он не будет работать неоднократно.
Эта программа избегает многократных методов работы программ совершенно уникальна. Поскольку после того, как я попробовал некоторые методы в Интернете, я обнаружил, что когда программа была активирована из минимизированного состояния, окно не может быть сведено к минимуму при нажатии кнопки «Минимизировать окно». Таким образом, автор принимает метод отправки и обработки пользовательских сообщений. Когда программа работает, сначала перечислите окна в системе. Программа запуска отображает окно после получения пользовательского сообщения.
// файл проекта procviewpro.dpr
Program ProcviewPro;
Использование
Формы, окна, сообщения, основные в 'procview.pas' {form1};
{$ R *.res}
{
// это автоматически по системе
Начинать
Application.initialize;
Application.title: = 'Системный мониторинг процесса';
Application.createform (tform1, form1);
Application.Run;
конец.
}
вар
myhwnd: hwnd;
Начинать
myhwnd: = findwindow (nil, 'Системный мониторинг'); // Найти окно
Если 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);
}
конец.
{
// Ниже приведен метод использования глобальных атомов, чтобы избежать повторного запуска программ
констант
atomstr = 'procview';
вар
Атом: целое число;
Начинать
Если Globalfindatom (atomstr) = 0, то
Начинать
Atom: = GlobalAddatom (Atomstr);
с приложением DO
Начинать
Инициализировать;
Название: = 'Системный мониторинг процесса';
CreateForm (tform1, form1);
Бегать;
конец;
Globaldeleteatom (атом);
конец;
конец.
}
// ЕДИНАЛЬНЫЙ ФАЙЛ ПРОКРЕВЕР.PAS
Unit Procview;
интерфейс
Использование
Windows, сообщения, Sysutils, классы, графика, управления, формы, диалоги,
STDCTRLS, TLHELP32, кнопки, Comctrls, Extctrls, Shellapi, Myflag;
констант
Process_terminate = 0;
Systray_id = 1;
Wm_systraymsg = wm_user+100;
тип
Tform1 = class (tform)
lvsysproc: tlistview;
lblsysproc: tlabel;
lblaboutproc: tlabel;
lvaboutproc: tlistView;
lblcountsysproc: tlabel;
lblcountaboutproc: tlabel;
Панель1: Tpanel;
Btndetermine: Tbutton;
Btnrefresh: Tbutton;
LBLOTHERS: Tlabel;
Lblemail: Tlabel;
Myflag1: tmyflag;
Процедура Btnrefreshclick (отправитель: t object );
Процедура BtnTetermineClick (отправитель: T Object );
Процедура lvsysprocclick (отправитель: t object );
Процедура FormCreate (отправитель: T объект );
Процедура ApponMinimize (отправитель: t объект );
Процедура FormClose (отправитель: T объект ; var action: tcloseaction);
Процедура FormDeActivate (отправитель: T Object );
Процедура lblemailclick (отправитель: t object );
процедура FormReSize (отправитель: T Object );
Частный
{Частные объявления}
Fshandle: Thandle;
FormoldHeight, FormoldWidth: Integer;
Процедура Systray OnClick (var Message: tmessage); Сообщение wm_systraymsg;
публичный
{Публичные объявления}
конец;
вар
Форма1: tform1;
Idid: dword;
FP32: tProcessEntry32;
FM32: Tmoduleentry32;
Systrayicon: tnotifyicondata;
Выполнение
{$ R *.dfm}
Function RegisterServiceProcess (DWProcessId, Dwtype: Integer): Integer; Stdcall; внешний 'kernel32.dll';
Процедура tform1.btnrefreshclick (отправитель: t object );
вар
CLP: Bool;
NewItem1: tListItem;
Myicon: Тикон;
Iconindex: слово;
Procfile: массив [0..max_path] char;
Начинать
Myicon: = ticon.create;
lvsysproc.items.clear;
lvsysproc.smallimages.clear;
fshandle: = createtoolhelp32snapshot (th32cs_snappocess, 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: = Extractassociatedicon (hinstance, procfile, iconindex);
Если myicon.handle <> 0, тогда
Начинать
с Lvsysproc do
Начинать
NewItem1.imageIndex: = shinkimages.addicon (myicon);
конец;
конец;
с newitem1.subitems делают
Начинать
add (inttoHex (FP32.Th32processId, 4));
Add (inttoHex (FP32.Th32parentProcessId, 4));
Add (inttoHex (fp32.pcpriclassbase, 4));
Добавить (inttoHex (fp32.cntusage, 4));
Add (inttoStr (fp32.cntthreads));
конец;
конец;
CLP: = Process32next (fshandle, FP32);
конец;
Крупный отрыв (fshandle);
lblcountsysproc.caption: = inttoStr (lvsysproc.items.count);
Myicon.free;
конец;
Процедура tform1.btndetermineclick (отправитель: t object );
вар
Processhndle: Thandle;
Начинать
с Lvsysproc do
Начинать
Если выбрано = nil then
Начинать
MessageBox (form1.handle, «Пожалуйста, выберите процесс, который будет сначала завершен!
конец
еще
Начинать
Если MessageBox (form1.handle, pchar ('verminate'+itemfocused.caption+'?')
, 'Завершение процесса', mb_yesno+mb_iconwarning+mb_defbutton2) = mryes тогда
Начинать
idid: = strtoint ('$'+itemfocused.subitems [0]);
ProcessHndle: = OpenProcess (Process_Terminate, Bool (0), IDID);
Если Integer (TerminateProcess (ProcessShndle, 0)) = 0 then
MessageBox (form1.handle, pchar ('не может завершить'+itemfocused.caption+'!')
, «Операция не удалась», MB_OK+MB_IC Onerror )
еще
Начинать
Selected.delete;
lvaboutproc.items.clear;
lblcountsysproc.caption: = inttoStr (lvsysproc.items.count);
lblcountaboutproc.caption: = '';
конец
конец;
конец;
конец;
конец;
Процедура tform1.lvsysprocclick (отправитель: t object );
вар
NewItem2: tListItem;
CLP: Bool;
Начинать
Если lvsysproc.selected <> nil then
Начинать
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 DO
Начинать
Подпись: = FM32.SzeexePath;
с newitem2. subitems делают
Начинать
add (inttoHex (FM32.TH32ModuleId, 4));
add (inttoHex (fm32.glblcntusage, 4));
add (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
Начинать
МАЙДИМ: = Timagelist.createSize (16,16);
Shipimages.ShareImages: = true;
конец;
Formoldwidth: = self.width;
Formoldheight: = self.height;
конец;
// он автоматически скрыт, когда минимизируется
Процедура tform1.apponminimize (отправитель: t object );
Начинать
ShowWindow (Application.Handle, SW_HIDE);
конец;
// Ответ мышь, чтобы нажать на значок области лотка системы
Процедура tform1.systray onclick (var message: tmessage);
Начинать
с сообщением
Начинать
if (lparam = wm_lbuttondown) или (lparam = wm_rbuttondown) тогда
Начинать
Application.Restore;
SetForegroundWindow (ручка);
ShowWindow (Application.Handle, SW_HIDE);
конец;
конец;
конец;
Процедура tform1.formClose (отправитель: t объект ; 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]'), ноль, ноль, sw_show) <33 тогда
MessageBox (form1.Handle, «не может запустить программное обеспечение по электронной почте!», «Извините», MB_ICONINFormation+MB_OK);
конец;
// Регулируют положение каждого компонента при изменении размера формы
Процедура tform1.formresize (отправитель: t object );
Начинать
с панелью 1 Do Top: = top+self.height-formoldheight;
с Lvsysproc do
Начинать
Ширина: = ширина+self.-formoldwidth;
конец;
с LvaboutProc Do
Начинать
высота: = высота+самостоятельно.
Ширина: = ширина+self.-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