请问:怎样才能获得一个正在运行的进程的句柄呐?

hukk3029 2004-09-10 10:01:35
请问:怎样才能获得一个正在运行的进程的句柄呐?
...全文
132 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr-Chen 2004-09-13
  • 打赏
  • 举报
回复
BOOL CGraphApp::ListProcesses()
{
//初始化
HANDLE hProcessSnap = NULL;
PROCESSENTRY32 pe32 = {0};
//获得句柄
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap == (HANDLE)-1)
{
printf("\nCreateToolhelp32Snapshot()failed:%d",GetLastError());
return 0;
}
pe32.dwSize = sizeof(PROCESSENTRY32);

//列举所有进程名称
if (Process32First(hProcessSnap, &pe32))
{
do
{CString str=pe32.szExeFile;
//AfxMessageBox(str.Left(8));
if(str.Left(8)=="GraphSee")//进程名
{
CloseHandle (hProcessSnap);
return 1;}

}
while (Process32Next(hProcessSnap, &pe32));//直到列举完毕

}
else
{
printf("\nProcess32Firstt() failed:%d",GetLastError());
CloseHandle (hProcessSnap);
return 0;
}
//关闭句柄
CloseHandle (hProcessSnap);
return 0;
}
Mr-Chen 2004-09-13
  • 打赏
  • 举报
回复
FindWidow
或枚举进程
Avoid 2004-09-10
  • 打赏
  • 举报
回复
#define BUFFSIZE 4096
BOOL KillProcess(DWORD processID);

BOOL KillAndStartExplorer()
{//终止和启动Explorer
CWnd *wnd = new CWnd;

HWND hwnd = wnd->m_hWnd;
unsigned int nLoop;
DWORD paProc[1024],cbNeeded,cProcesses;
CRegDlgApp *pApp = (CRegDlgApp *) AfxGetApp();
if ( !EnumProcesses(paProc, BUFFSIZE, &cbNeeded ))
return FALSE;
cProcesses = cbNeeded / sizeof(DWORD);

for ( nLoop = 0; nLoop < cProcesses; nLoop++ )
KillProcess( paProc[nLoop]);

Sleep(1000);

if ( !EnumProcesses(paProc, BUFFSIZE, &cbNeeded ))
return FALSE;
cProcesses = cbNeeded / sizeof(DWORD);

for ( nLoop = 0; nLoop < cProcesses; nLoop++ )
{
if (!StartProcess( paProc[nLoop]))
{
ShellExecute(hwnd,"open","explorer.exe","","", SW_SHOW );
}
}

CloseHandle(hwnd);
delete wnd;
return TRUE;
}

BOOL KillProcess(DWORD processID)
{//终止Explorer
char szProcessName[MAX_PATH] = "unknown";

HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS,FALSE, processID );

if (NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;

if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),&cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName,sizeof(szProcessName) );
CString str = szProcessName;
str.MakeUpper();
if (str == "EXPLORER.EXE")
{
TerminateProcess(hProcess,0);
return TRUE;
}
}
return FALSE;
}

CloseHandle( hProcess );
return FALSE;
}

BOOL StartProcess(DWORD processID)
{//启动Explorer
char szProcessName[MAX_PATH] = "unknown";

HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS,FALSE, processID );

if (NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;

if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),&cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName,sizeof(szProcessName) );
CString str = szProcessName;
str.MakeUpper();
if (str == "EXPLORER.EXE")
{
return FALSE;
}
}
}
CloseHandle( hProcess );
return TRUE;

}

自己改吧,终止和启动Explorer
Avoid 2004-09-10
  • 打赏
  • 举报
回复
#include <windows.h>
#include <stdio.h>
#include "psapi.h"

void PrintProcessNameAndID( DWORD processID )
{
char szProcessName[MAX_PATH] = "unknown";

// Get a handle to the process.

HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, processID );

// Get the process name.

if (NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;

if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
&cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName,
sizeof(szProcessName) );
}
else return;
}
else return;

// Print the process name and identifier.

printf( "%s (Process ID: %u)\n", szProcessName, processID );

CloseHandle( hProcess );
}

void main( )
{
// Get the list of process identifiers.

DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;

if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
return;

// Calculate how many process identifiers were returned.

cProcesses = cbNeeded / sizeof(DWORD);

// Print the name and process identifier for each process.

for ( i = 0; i < cProcesses; i++ )
PrintProcessNameAndID( aProcesses[i] );
}
iamzxx 2004-09-10
  • 打赏
  • 举报
回复
应当知道执行程序的名字吧,GetModuleHandle(PCTSTR pszModule)可得到他的句柄
hukk3029 2004-09-10
  • 打赏
  • 举报
回复
该程序在硬盘上的存储路径是已知的.
DentistryDoctor 2004-09-10
  • 打赏
  • 举报
回复
BOOL EnableDebugPrivilege(BOOL fEnable/* =TRUE */)
{
BOOL fOK = FALSE;
HANDLE hToken = NULL;
if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken)){
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount =1;
LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges[0].Luid);
tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL);
fOK = (GetLastError()==ERROR_SUCCESS);
CloseHandle(hToken);
}
return fOK;
}
DentistryDoctor 2004-09-10
  • 打赏
  • 举报
回复
如果是当然进程,GetCurrentProcess(),如果是其它,需要找到其它进程的ID然后使用OpenPrcess,记住,你的进程需要相应的权限。
flyelf 2004-09-10
  • 打赏
  • 举报
回复
CreateToolhelp32Snapshot
ProcessFirst
ProcessNext

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧