Este programa busca y enumera los ID de todos los procesos, excepto este proceso en el sistema, los especificadores de archivos correspondientes, la prioridad, la parte de la CPU, el número de subprocesos, la información del proceso relacionado, etc. llamando a varias funciones API en Kernel32.dll. el proceso seleccionado.
Cuando este programa se está ejecutando, se agregará un ícono en el área de la bandeja del sistema, no aparecerá en la lista de tareas que aparece al presionar Ctrl+Alt+del, ni se mostrará el botón de la tarea en la barra de tareas, y será oculto automáticamente cuando está inactivo o minimizado. No se ejecutará repetidamente.
Este programa evita los métodos de ejecución repetidos de programas es bastante único. Porque después de probar algunos métodos en Internet, descubrí que cuando el programa se activó desde el estado minimizado, la ventana no se pudo minimizar al hacer clic en el botón Minimizar la ventana. Entonces, el autor adopta el método de enviar y procesar mensajes personalizados. Cuando el programa se ejecute, primero enumere las ventanas en el sistema. El programa en ejecución muestra una ventana después de recibir el mensaje personalizado.
// Proyecto Archivo ProcviewPro.DPR
Programa PROCVIEWPRO;
usos
Formularios, ventanas, mensajes, principales en 'procview.pas' {form1};
{$ R *.res}
{
// Esto es automático por el sistema
Comenzar
aplicación.initialize;
Application.title: = 'Monitoreo del proceso del sistema';
Application.CreateForm (TForm1, Form1);
Aplicación.run;
fin.
}
varilla
myhwnd: hwnd;
Comenzar
myhwnd: = findwindow (nil, 'monitoreo del proceso del sistema');
Si myhwnd = 0 entonces // no encontrado, continúa ejecutando
Comenzar
Aplicación.initialize;
Application.title: = 'Monitoreo del proceso del sistema';
Application.CreateForm (TForm1, Form1);
Aplicación.run;
fin
más // Descubre la ventana, envíe el mensaje del área de la bandeja del sistema de clics del mouse para activar la ventana
PostMessage (myhwnd, wm_systraymsg, 0, wm_lbuttondown);
{
// La desventaja del siguiente método es: si la ventana estaba originalmente en un estado minimizado, hacer clic en el botón Minimizar la ventana después de la activación no minimizará la ventana.
showwindow (myhwnd, sw_restore);
Flashwindow (myhwnd, verdadero);
}
fin.
{
// El siguiente es un método para usar átomos globales para evitar la ejecución repetida de programas
estúpido
Atomstr = 'Procview';
varilla
Atom: entero;
Comenzar
Si GlobalFindatom (Atomstr) = 0 entonces
Comenzar
Atom: = GlobalAdDatom (Atomstr);
con la aplicación DO
Comenzar
Inicializar;
Título: = 'Monitoreo del proceso del sistema';
CreateForm (tForm1, form1);
Correr;
fin;
globalDeletEteatom (átomo);
fin;
fin.
}
// Archivo de la unidad procview.pas
Procview de unidad;
interfaz
usos
Windows, mensajes, sysutils, clases, gráficos, controles, formularios, diálogos,
Stdctrls, tlhelp32, botones, comctrls, extctrls, shellapi, myflag;
estúpido
Process_merminate = 0;
SyStray_id = 1;
Wm_systraymsg = wm_user+100;
tipo
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;
procedimiento btnrefreshclick (remitente: t objeto );
procedimiento btndetermineclick (remitente: t objeto );
procedimiento lvsysprocclick (remitente: t objeto );
procedimiento formulcreate (remitente: t objeto );
procedimiento AponMinimize (remitente: t objeto );
procedimiento FormClose (remitente: T Objeto ; Acción var: TCLoseAction);
procedimiento formeDeActivate (remitente: t objeto );
procedimiento lblemailClick (remitente: t objeto );
Procedimiento FormResize (remitente: t objeto );
Privado
{Declaraciones privadas}
Fshandle: Thandle;
FormoldHeight, FormoldWidth: Integer;
Procedimiento SyStray OnClick (Mensaje VAR: TMessage); Mensaje wm_systraymsg;
público
{Declaraciones públicas}
fin;
varilla
Form1: tform1;
idid: dword;
FP32: TProcessEntry32;
FM32: tmoduleEntry32;
Systrayicon: tnotifyicondata;
Implementación
{$ R *.dfm}
Función RegisterServiceProcess (dwprocessid, dwtype: integer): integer; stdcall; externo 'kernel32.dll';
procedimiento tform1.btnrefreshClick (remitente: t objeto );
varilla
CLP: bool;
NewItem1: tlistitem;
Myicon: Ticon;
Iconindex: palabra;
Procfile: array [0..max_path] de char;
Comenzar
Myicon: = ticon.create;
lvsysproc.items.clear;
lvsysproc.smallimages.clear;
fshandle: = createToolHelp32SnapShot (th32cs_snapprocess, 0);
fp32.dwsize: = sizeof (fp32);
CLP: = Process32First (FShandle, FP32);
IconIndex: = 0;
mientras que entero (CLP) <> 0 do
Comenzar
Si fp32.th32processid <> getCurrentProcessid entonces
Comenzar
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: = extractoSociatedicon (hinstance, procfile, iconindex);
Si myicon.handle <> 0 entonces
Comenzar
con lvsysproc do
Comenzar
NewItem1.ImageIndex: = smallImages.addicon (myicon);
fin;
fin;
con newitem1.subitems do
Comenzar
add (inttoHex (fp32.th32processid, 4));
Add (inttoHex (fp32.th32parentprocessid, 4));
Add (inttoHex (FP32.pcPricLassBase, 4));
Add (inttoHex (fp32.cntusage, 4));
Add (intToStr (fp32.cntthreads));
fin;
fin;
CLP: = Process32Next (Fshandle, FP32);
fin;
CloseHandle (fshandle);
LBLCountsysproc.Caption: = intToStr (lvsysproc.items.count);
Myicon.
fin;
procedimiento tform1.btndetermineClick (remitente: t objeto );
varilla
ProcessHndle: Thandle;
Comenzar
con lvsysproc do
Comenzar
si se selecciona = nil entonces
Comenzar
MessageBox (form1.handle, 'Seleccione el proceso que se finalizará primero!', 'Operación Solicitud', MB_OK+MB_ICONInformation);
fin
demás
Comenzar
If MessageBox (form1.handle, pchar ('terminar'+itemFocused.caption+'?')
, 'Terminar Process', MB_YESNO+MB_ICONWARNING+MB_DEFBUTTON2) = MRYES entonces
Comenzar
idid: = strToint ('$'+itemfocused.subitems [0]);
ProcessHndle: = OpenProcess (Process_terMinate, Bool (0), IDID);
If Integer (termineProcess (ProcessShndle, 0)) = 0 entonces
MessageBox (form1.handle, pChar ('no se puede terminar'+itemfocused.caption+'!')
, 'Operación fallida', MB_OK+MB_IC OnError )
demás
Comenzar
Seleccionado.delete;
lvaboutproc.items.clear;
LBLCountsysproc.Caption: = intToStr (lvsysproc.items.count);
lblCountaboutProc.Caption: = '';
fin
fin;
fin;
fin;
fin;
procedimiento tform1.lvsysprocclick (remitente: t objeto );
varilla
NewItem2: tlistitem;
CLP: bool;
Comenzar
Si lvsysproc.selected <> nil entonces entonces
Comenzar
idid: = strToint ('$'+lvsysproc.itemfocused.subitems [0]);
lvaboutproc.items.clear;
fshandle: = createToolHelp32SnapShot (th32cs_snapModule, idid);
fm32.dwsize: = sizeof (fm32);
CLP: = MODULE32FIRST (FSHANDLE, FM32);
mientras que entero (CLP) <> 0 do
Comenzar
newItem2: = lvaboutproc.items.add;
con newitem2 do
Comenzar
Leyenda: = fm32.szeExepath;
con newitem2.subitems do
Comenzar
add (inttoHex (fm32.th32ModuleId, 4));
add (inttoHex (fm32.glblcntusage, 4));
add (inttoHex (fm32.ProccntUsage, 4));
fin;
fin;
CLP: = MODULE32NEXT (FSHANDLE, FM32);
fin;
CloseHandle (fshandle);
lblCountaboutProc.Caption: = intToStr (lvaboutproc.items.count);
fin
fin;
procedimiento tForm1.FormCreate (remitente: t objeto );
Comenzar
con la aplicación DO
Comenzar
showwindow (manejar, sw_hide);
Onminimize: = aplonminimize;
OnDeActivate: = FormDeActivate;
Onactivate: = btnrefreshclick;
fin;
RegisterServiceProcess (GetCurrentProcessid, 1);
con systrayicon do
Comenzar
cbsize: = sizeof (systrayicon);
wnd: = manejar;
uid: = syStray_id;
UFLAGS: = NIF_ICON o NIF_MESSAGE o NIF_TIP;
ucallbackMessage: = wm_systraymsg;
HiCon: = Application.icon.handle;
sztip: = 'monitoreo del proceso del sistema';
fin;
Shell_notifyicon (nim_add,@systrayicon);
con lvsysproc do
Comenzar
SmallImages: = timagelist.createSize (16,16);
SmallImages.shareImages: = true;
fin;
Formoldwidth: = self.width;
Formoldheight: = self.height;
fin;
// se oculta automáticamente cuando se minimiza
procedimiento tForm1.ApponMinimize (remitente: t objeto );
Comenzar
Showwindow (aplicación.handle, sw_hide);
fin;
// Responde al mouse para hacer clic en el icono del área de la bandeja del sistema
Procedimiento tForm1.Systray OnClick (Mensaje VAR: TMessage);
Comenzar
con mensaje hacer
Comenzar
if (lparam = wm_lbuttondown) o (lParam = wm_rbuttondown) entonces
Comenzar
Application.Restore;
SetForeforeWindow (mango);
showwindow (aplicación.handle, sw_hide);
fin;
fin;
fin;
procedimiento tForm1.FormClose (remitente: T Object ; Var Action: TCLoseAction);
Comenzar
Shell_notifyicon (NIM_DELETE,@syStrayicon);
RegisterServiceProcess (GetCurrentProcessid, 0);
lvsysproc.smallimages.free;
fin;
// se esconderá automáticamente cuando esté inactivo
procedimiento tForm1.FormDeActivate (remitente: t objeto );
Comenzar
aplicación.minimize;
fin;
procedimiento tForm1.lblemailClick (remitente: t objeto );
Comenzar
Si ShellexCute (Handle, 'Open', Pchar ('Mailto: [email protected]'), nil, nil, sw_show) <33 entonces
MessageBox (form1.handle, '¡No se puede iniciar el software de correo electrónico!', 'Lo siento', mb_iconinformation+mb_ok);
fin;
// ajustar la posición de cada componente cuando cambia el tamaño de la formulario
procedimiento tForm1.FormResize (remitente: t objeto );
Comenzar
con panel1 do arriba: = top+self.Height-FormoldHeight;
con lvsysproc do
Comenzar
Ancho: = ancho+self.width-formoldwidth;
fin;
con lvaboutproc do
Comenzar
altura: = altura+self.height-formoldheight;
Ancho: = ancho+self.width-formoldwidth;
fin;
Formoldwidth: = self.width;
Formoldheight: = self.height;
fin;
fin.
Los programas anteriores se pueden compilar y ejecutar normalmente en Delphi 2, versión china de Windows 95, Delphi 5 y Windows 97 Versión china. Si tiene alguna pregunta, envíe un correo electrónico a: [email protected] para discutir conmigo.
posdata:
En el código anterior, RegissterserviceProcess () es una función API inédita que solo existe en Win 9x.
Después de aprender MASM32, reescribí y mejoré este programa con MASM32
Los amigos interesados pueden descargar la última versión:
http://www.hcny.gov.cn/netres/download/procview.rar