Este programa pesquisa e lista os IDs de todos os processos, exceto esse processo no sistema, especificadores de arquivo correspondentes, prioridade, compartilhamento da CPU, número de threads, informações de processo relacionadas etc. chamando várias funções da API no Kernel32.DLL. o processo selecionado.
Quando este programa estiver em execução, um ícone será adicionado na área da bandeja do sistema, ele não aparecerá na lista de tarefas que aparece ao pressionar Ctrl+Alt+Del, nem o botão de tarefa será exibido na barra de tarefas e será Oculto automaticamente quando inativo ou minimizado. Ele não será executado repetidamente.
Este programa evita que métodos de execução repetidos de programas são únicos. Porque depois que experimentei alguns métodos na Internet, descobri que, quando o programa foi ativado a partir do estado minimizado, a janela não pôde ser minimizada ao clicar no botão Minimize da janela. Portanto, o autor adota o método de enviar e processar mensagens personalizadas. Quando o programa estiver em execução, primeiro enumere as janelas no sistema. O programa em execução exibe uma janela após receber a mensagem personalizada.
// Projeto Arquivo ProcViewPro.dpr
Programa ProcViewPro;
usos
Formulários, janelas, mensagens, principal em 'Procview.pas' {form1};
{$ R *.res}
{
// Isso é automático pelo sistema
Começar
Application.initialize;
Application.title: = 'Monitoramento do processo do sistema';
Application.CreatEform (TForm1, Form1);
Application.run;
fim.
}
var
myhwnd: hwnd;
Começar
myhwnd: = findWindow (nil, 'Monitoramento do processo do sistema');
Se myhwnd = 0 então // não encontrado, continue correndo
Começar
Application.initialize;
Application.title: = 'Monitoramento do processo do sistema';
Application.CreatEform (TForm1, Form1);
Application.run;
fim
else // Descubra a janela, envie a mensagem da área de bandeja do sistema de cliques do mouse para ativar a janela
PostMessage (myhwnd, wm_systraymsg, 0, wm_lbuttondown);
{
// A desvantagem do método a seguir é: se a janela estivesse originalmente em um estado minimizado, clicar na janela minimizar o botão após a ativação não minimizar a janela.
showwindow (myhwnd, sw_restore);
Flashwindow (myhwnd, true);
}
fim.
{
// a seguir é um método para usar átomos globais para evitar a execução repetida de programas
const
atomstr = 'prociew';
var
átomo: número inteiro;
Começar
Se GlobalFindatom (Atomstr) = 0 então
Começar
Atom: = GlobalAddatom (Atomstr);
com aplicação do
Começar
Inicializar;
Título: = 'Monitoramento do processo do sistema';
CreateForm (TForm1, Form1);
Correr;
fim;
globaldeleteatom (átomo);
fim;
fim.
}
// FILE DE UNIDADE PROCVIED.PAS
unidade Procview;
interface
usos
Windows, mensagens, sysutils, aulas, gráficos, controles, formulários, diálogos,
Stdctrls, tlhelp32, botões, comctrls, extctrls, shellapi, myflag;
const
Process_terminate = 0;
Systray_id = 1;
Wm_systraymsg = wm_user+100;
tipo
Tform1 = classe (tform)
lvsysproc: tlistView;
lblsysproc: tlabel;
lblaboutproc: tlabel;
LvaboutProc: TlistView;
lblCountSysProc: Tlabel;
LBLCountaboutProc: Tlabel;
Painel1: tpanel;
Btndetermine: tbutton;
BtnRefresh: Tbutton;
lbrothers: tlabel;
Limparilista: Tlabel;
Myflag1: tmyflag;
procedimento btnrefreshClick (remetente: objeto t);
procedimento btndetermineclick (remetente: t objeto );
Procedimento LVSYSProcClick (Remetente: T Object );
Procedimento FormCreate (Remetente: T Object );
procedimento APPONMINIMIZE (REMPADOR: T Object );
procedimento formClose (remetente: objeto t; var ação: tcloSeation);
Procedimento formDeActivate (Remetente: T Object );
Procedimento LBlemailClick (Remetente: T Object );
procedimento formRresize (remetente: t objeto );
Privado
{Declarações privadas}
Fshandle: Thandle;
FormoldHeight, FormoldWidth: Integer;
Procedimento Systray OnClick (Var Mensagem: TMessage); Mensagem WM_SYSTRAYMSG;
público
{Declarações públicas}
fim;
var
Form1: TForm1;
idid: dword;
fp32: tprocessentry32;
FM32: tmoduleEntry32;
Systrayicon: tnotifyicondata;
Implementação
{$ R *.dfm}
Função RegisterServiceProcess (DWProcessId, Dwtype: Integer): Inteiro; StdCall; externo 'Kernel32.dll';
procedimento tform1.btnrefreshClick (remetente: objeto t);
var
CLP: Bool;
newItem1: tlistitem;
Myicon: Ticon;
Iconindex: word;
Procfile: Array [0..max_path] de char;
Começar
Myicon: = ticon.create;
lvsysproc.items.clear;
lvsysproc.smallimages.clear;
fshandle: = createToolHelp32snapshot (th32cs_snapprocess, 0);
fp32.dwsize: = sizeof (fp32);
CLP: = Process32First (fshandle, fp32);
Iconindex: = 0;
enquanto inteiro (clp) <> 0 do
Começar
Se fp32.th32ProcessId <> getCurrentprocessId, então
Começar
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);
Se myicon.Handle <> 0 então
Começar
com lvsysproc fazer
Começar
NewItem1.ImageIndex: = smallimages.addicon (myicon);
fim;
fim;
com newItem1.subitems
Começar
add (inttohex (fp32.th32processid, 4));
Add (inttohex (fp32.th32ParentprocessId, 4));
Add (inttohex (fp32.pcpriclassBase, 4));
Add (inttohex (fp32.cntusage, 4));
Add (inttostr (fp32.cntthreads));
fim;
fim;
CLP: = Process32Next (fshandle, fp32);
fim;
CloseHandle (fshandle);
lblCountSysProc.caption: = inttostr (lvsysproc.items.count);
Myicon.free;
fim;
procedimento TFform1.BtNDetermineClick (Remetente: T Object );
var
Processhndle: Thandle;
Começar
com lvsysproc fazer
Começar
se selecionado = nil então
Começar
MessageBox (Form1.Handle, 'Por favor, selecione o processo a ser encerrado primeiro!', 'Operação Prompt', MB_OK+MB_ICONINFORMATION);
fim
outro
Começar
Se MessageBox (Form1.Handle, PChar ('encerrar'+itemFocused.Caption+'?')
, 'Termine Process', mb_yesno+mb_iconwarning+mb_defbutton2) = mryes então
Começar
idid: = strtoint ('$'+itemFocused.subitems [0]);
ProcessHnled: = OpenProcess (Process_terminate, bool (0), IDID);
Se inteiro (TermineProcess (ProcessShNdle, 0)) = 0 então
MessageBox (Form1.Handle, PChar ('Não é possível encerrar'+itemFocused.Caption+'!')
, 'Operação falhou', mb_ok+mb_ic onError )
outro
Começar
Selected.delete;
lvaboutproc.items.clear;
lblCountSysProc.caption: = inttostr (lvsysproc.items.count);
lblCountaboutproc.caption: = '';
fim
fim;
fim;
fim;
fim;
procedimento tform1.lvsysProcClick (remetente: t Object );
var
newItem2: tlistitem;
CLP: Bool;
Começar
Se lvsysproc.selected <> nil então
Começar
idid: = strtoint ('$'+lvsysproc.itemfocused.subitems [0]);
lvaboutproc.items.clear;
fshandle: = createToolHelp32snapshot (th32cs_snapmodule, idid);
FM32.DWSize: = sizeof (fm32);
CLP: = MODULE32FIRST (FSHANDLE, FM32);
enquanto inteiro (clp) <> 0 do
Começar
newItem2: = lvaboutproc.items.add;
com newItem2 fazer
Começar
Legenda: = FM32.SzeexEPATH;
com newItem2.subitems
Começar
add (inttohex (fm32.th32moduleid, 4));
add (inttohex (fm32.glblcntusage, 4));
add (inttohex (fm32.proccntusage, 4));
fim;
fim;
CLP: = MODULE32NEXT (FSHandle, FM32);
fim;
CloseHandle (fshandle);
lblCountaboutproc.caption: = inttostr (lvaboutproc.items.count);
fim
fim;
procedimento tform1.formCreate (remetente: objeto t);
Começar
com aplicação do
Começar
ShowWindow (Handle, SW_HIDE);
OnMinimize: = Apponminimize;
ONDACTIVATE: = FormDeActivate;
ONATIVATE: = BtnRefreshClick;
fim;
RegisterServiceProcess (getCurrentProcessId, 1);
com systrayicon fazer
Começar
cbsize: = sizeof (systrayicon);
wnd: = handle;
uid: = systray_id;
uflags: = nif_icon ou nif_message ou nif_tip;
uCallbackMessage: = wm_systraymsg;
hicon: = Application.icon.handle;
sztip: = 'Monitoramento do processo do sistema';
fim;
Shell_notifyicon (nim_add,@systrayicon);
com lvsysproc fazer
Começar
SmallImages: = timagelist.createsize (16,16);
Smallimages.ShareImages: = true;
fim;
FormoldWidth: = self.width;
FormoldHeight: = self.Height;
fim;
// está automaticamente oculto quando minimizado
procedimento TFFORM1.APPONMINIMIZE (REMPADOR: T Object );
Começar
ShowWindow (Application.Handle, SW_HIDE);
fim;
// Responda o mouse para clicar no ícone da área da bandeja do sistema
procedimento TFFORM1.SYSTRAY ONCLICK (VAR Mensagem: TMessage);
Começar
com a mensagem
Começar
if (lparam = wm_lbuttondown) ou (lparam = wm_rbuttondown) então
Começar
Application.restore;
SetforegroundWindow (Handle);
ShowWindow (Application.Handle, SW_HIDE);
fim;
fim;
fim;
procedimento tform1.formClose (remetente: objeto t; var ação: tcloSeAction);
Começar
Shell_notifyicon (nim_delete,@systrayicon);
RegisterserviceProcess (getCurrentProcessId, 0);
lvsysproc.smallimages.free;
fim;
// vai se esconder automaticamente quando inativo
Procedimento TForm1.FormDeActivate (Remetente: T Object );
Começar
Application.Minimize;
fim;
procedimento TFFORM1.LBLEMAILCLICK (Remetente: T Object );
Começar
Se Shellexecute (Handle, 'Open', PChar ('Mailto: [email protected]'), nil, nil, sw_show) <33 então
MessageBox (Form1.Handle, 'Não é possível iniciar o software de email!', 'Sinto muito', mb_iconinformation+mb_ok);
fim;
// Ajusta a posição de cada componente quando o tamanho do formulário mudar
procedimento TFFORM1.FORMRESIZE (REMPADOR: T Object );
Começar
com o painel1 do topo: = top+self.height-formoldHeight;
com lvsysproc fazer
Começar
largura: = largura+self.width-formedwidth;
fim;
com lvaboutproc fazer
Começar
altura: = altura+self.height-formoldHeight;
largura: = largura+self.width-formedwidth;
fim;
FormoldWidth: = self.width;
FormoldHeight: = self.Height;
fim;
fim.
Os programas acima podem ser compilados e executados normalmente em Delphi 2, Windows 95 Chinese Version, Delphi 5 e Windows 97 Chinese Version. Se você tiver alguma dúvida, envie um email para: [email protected] para discutir comigo.
PostScript:
No código acima, o RegisterServiceProcess () é uma função de API não publicada que existe apenas no Win 9x.
Depois de aprender MASM32, reescrevi e melhorei este programa com MASM32
Amigos interessados podem baixar a versão mais recente:
http://www.hcny.gov.cn/netres/download/procview.rar