如何获得ctrl+alt+del列出的程序的句柄(200分)

  • 主题发起人 主题发起人 冰封
  • 开始时间 开始时间

冰封

Unregistered / Unconfirmed
GUEST, unregistred user!
如何获得ctrl+alt+del列出的程序的句柄
 
你好,好像我以有一个程序有这们的代码,
但我不能确定是否还能找到,找到后,我
就发给你,请写信给我:cgh0717@sina.com
 
try EnumWindows() API function
 
回调函数,能有用吗?
关注
 
没人知道吗?
 
很简单,连看不出的都能找到。
 
有一个C++ Builder的程序,用来得到句柄,并显示标题,看看吧。

Process.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>

#define TH32CS_SNAPPROCESS 0x00000002 //快照进程
#define PROCESS_HANDLE_NAME 255
//---------------------------------------------------------------------------
typedef struct tagPROCESSENTRY32 //自定义TOOLHELP32结构
{
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID; //进程ID
DWORD th32DefaultHeapID;
DWORD th32ModuleID;
DWORD cntThreads;
DWORD th32ParentProcessID;
LONG pcPriClassBase;
DWORD dwFlags;
TCHAR szExeFile[MAX_PATH]; //进程文件名
} PROCESSENTRY32;

typedef PROCESSENTRY32 * LPPROCESSENTRY32;

//以下定义要从KERENL32.DLL中取出的TOOLHELP32函数的函数指针

HANDLE (WINAPI *CreateToolhelp32Snapshot)(DWORD dwFlags,DWORD th32PD);
BOOL (WINAPI *Process32First)(HANDLE hSnapshot,LPPROCESSENTRY32 pe);
BOOL (WINAPI *Process32Next)(HANDLE hSnapshot,LPPROCESSENTRY32 pe);

//以下定义要从PSAPI.DLL中取出函数的函数指针
BOOL (WINAPI *EnumProcesses)(DWORD* lpidProcess,DWORD cb,DWORD *cbNeeded);
DWORD (WINAPI *GetModuleFileNameExA)(HANDLE hProcess,HMODULE hModule,LPTSTR lpstrFileName,DWORD nSize);


class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *FindAllProcessFileName;
TListBox *ListBox1;
void __fastcall FindAllProcessFileNameClick(TObject *Sender);
void __fastcall FormResize(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
void __fastcall ListBox1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Process.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1 *Form1;

//定义变量
HANDLE process[255];
PROCESSENTRY32 p32;
DWORD process_ids[255];
DWORD num_processes;
TCHAR file_name[MAX_PATH];
TCHAR class_name[MAX_PATH];
unsigned i;
//---------------------------------------------------------------------------

//初始化TOOLHELP32
BOOL InitToolHelp32()
{
//动态调用
HINSTANCE DLLinst=LoadLibrary("KERNEL32.DLL");
if(DLLinst)
{
//取各函数在KERNEL32中的地址
CreateToolhelp32Snapshot=(HANDLE(WINAPI *)(DWORD dwFlags,DWORD th32PD))
GetProcAddress(DLLinst,"CreateToolhelp32Snapshot");
Process32First=(BOOL(WINAPI *)(HANDLE hSnapshot,LPPROCESSENTRY32 pe))
GetProcAddress(DLLinst,"Process32First");
Process32Next=(BOOL(WINAPI *)(HANDLE hSnapshot,LPPROCESSENTRY32 pe))
GetProcAddress(DLLinst,"Process32Next");
if((!(UINT)CreateToolhelp32Snapshot)||(!(UINT)Process32First)||(!(UINT)Process32Next))
return FALSE;
else
return TRUE;
}
return FALSE;
}


//初始化PSAPI
BOOL InitPSAPI()
{
HINSTANCE PSAPI=LoadLibrary("PSAPI.DLL");
if(NULL==PSAPI)
return FALSE;
EnumProcesses=(BOOL(WINAPI *)(DWORD* lpidProcess,DWORD cb,DWORD *cbNeeded))
GetProcAddress(PSAPI,"EnumProcesses");
GetModuleFileNameExA=(DWORD(WINAPI *)(HANDLE hProcess,HMODULE hModule,LPTSTR lpstrFileName,DWORD nSize))
GetProcAddress(PSAPI,"GetModuleFileNameExA");
if(NULL == EnumProcesses||NULL == GetModuleFileName)
return FALSE;
else
return TRUE;
}


__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FindAllProcessFileNameClick(TObject *Sender)
{
OSVERSIONINFO osinfo;
osinfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
//取当前操作系统类型
if(GetVersionEx(&osinfo))
{
switch(osinfo.dwPlatformId)
{
//当前操作系统是WIN9X
case VER_PLATFORM_WIN32_WINDOWS:
if(InitToolHelp32())
{
ListBox1->Clear();
p32.dwSize=sizeof(PROCESSENTRY32);
//初始化TOOLHELP32快照
HANDLE pName=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
//开始查找
BOOL Next=Process32First(pName,&p32);
i=0;
//遍历进程
while(Next)
{
//显示进程
ListBox1->Items->Add(p32.szExeFile);
//根据进程ID获取句并
process=OpenProcess(PROCESS_TERMINATE,0,p32.th32ProcessID);
//继续查找
Next=Process32Next(pName,&p32);
i++;
}
CloseHandle(pName);
}
break;

//当前操作系统是NT
case VER_PLATFORM_WIN32_NT:
if(InitPSAPI())
{
ListBox1->Clear();
//获取当前进程个数
EnumProcesses(process_ids,sizeof(process_ids),&num_processes);
//遍历进程
for(i=0; i<num_processes; i++)
{
//根据进程ID获取句并
process=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ
,0,process_ids);
//通过句并获取进程文件名
if(GetModuleFileNameExA(process,NULL,file_name,sizeof(file_name)))
ListBox1->Items->Add(file_name);
}
}
break;
}
}
}

//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
int iCount;
iCount=ListBox1->ItemIndex;
ListBox1->Hint=ListBox1->Items->Strings[iCount];
}
//---------------------------------------------------------------------------


 
抄别人的,在95、98、2000下测试通过

FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
//创建系统快照
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
//先初始化 FProcessEntry32 的大小
Ret:=Process32First(FSnapshotHandle,FProcessEntry32);
while Ret do
ProcessID:=FProcessEntry32.th32ProcessID;
Ret:=Process32Next(FSnapshotHandle,FProcessEntry32);
CloseHandle(FSnapshotHandle);
 
或许对你有用:
function KillTask(ExeFileName: string): integer;{Uses Tlhelp32}
const
PROCESS_TERMINATE=$0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);

end;
CloseHandle(FSnapshotHandle);
end;
 
接受答案了.
 
后退
顶部