|
发表于 2007-4-23 12:05:32
|
显示全部楼层
在网上找了一个VC的;
原贴地址如下:
http://maxsblog.bokee.com/viewdiary.13304642.html
在VC中枚举系统所有进程+通过进程获取对应窗口 分类:时来运转之网络转转转需要引用的头文件:Tlhelp32.h
用到的API函数:CreateToolhelp32Snapshot、Process32First、Process32Next
代码如下:
// 枚举所有进程
void CEnumProcDlg::EnumProc(void)
{
PROCESSENTRY32 proc;
HANDLE snap = NULL;
CString procInfo;
BOOL theloop;
char exeName[] = ("qq.exe");
char ss[100] = {'\0'};
int i = 0;
snap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0); //获取进程快照句柄
proc.dwSize = sizeof(PROCESSENTRY32);
theloop = Process32First(snap, &proc); //查找第一个进程
while(theloop)
{
procInfo.Format("进程名:%s 进程ID:%d 父进程ID:%d",proc.szExeFile,proc.th32ProcessID,proc.th32ParentProcessID);
ChgString(proc.szExeFile, ss);//自定义函数,字符转化为小写
if(strcmp(exeName,ss) == 0 )
{
HANDLE g_hQQ = OpenProcess(PROCESS_ALL_ACCESS,TRUE,proc.th32ProcessID); //获取进程句柄
// if(g_hQQ!=NULL)
// MessageBox("OK","OK",MB_OK); //输出提示信息
}
//if(strcmp("QQ.EXE",proc.szExeFile) == 0 )
// MessageBox("OK","OK",MB_OK);
procInfo.Format("%s",proc.szExeFile);
m_ListCtrl.InsertItem(i,procInfo);
procInfo.Format("%d",proc.th32ProcessID);
m_ListCtrl.SetItem(i,1,LVIF_TEXT,procInfo,0,0,0,0);
procInfo.Format("%d",proc.th32ParentProcessID);
m_ListCtrl.SetItem(i,2,LVIF_TEXT,procInfo,0,0,0,0);
theloop = Process32Next(snap,&proc); //查找下一个进程
i++;
}
m_ListCtrl.SetRedraw(TRUE);
}
/////////////////another tech////////////////////////
可以啊,玫举窗口句柄,然后用窗口句柄去取得进程ID,比较得到的进程ID是不是你的进程ID,如果是,那么呢就得到了窗口句柄,如果不是,继续玫举。
那,这样:
DWORD dwProcessID; //你的进程号
VOID GetWindowHandle()
{
EnumWindows( EnumWindowsProc, (LPARAM)NULL);
}
static BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
DWORD pid = 0;
// 取得窗口的进程号
if (!GetWindowThreadProcessId( hwnd, &pid ))
{
return TRUE; // 继续玫举
}
// 查找窗口在任务列表中的对应项
if(dwProcessID == pid)
return FALSE;
return TRUE; // 继续玫举
}
////////////////通过进程获取对应窗口///////////////////
我通过CreateToolhelp32Snapshot遍历了整个进程,我想通过某进程的 HANDLE获取其对应主窗体的HWND,如何办?请高手指教。
---------------------------------------------------------------
EnumWindows(EnumWindowsProcGetWndTitle,0); //得到所有窗口列表
void EnumWindowsProcGetWndTitle(hWnd,lparam)
{
DWORD ProcID = 0;
GetWindowThreadProcessId(hWnd,&ProcID);
if(ProcID==YourProcID)//如果窗口的processid等于你的ID
{
HWND pWnd = GetParent(hWnd);
while(GetParent(pWnd)!=NULL)//得到父窗口的句柄
pWnd = GetParent(pWnd);
//ok pWnd 就是主窗口了。
}
}
你可以通过这个链接引用该篇文章:http://maxsblog.bokee.com/tb.b?diaryId=13304642 |
|