通过进程名取窗口句柄和进程ID的问题!~!~!~!~!~!~! 本人想取一个游戏的窗口句柄和进程ID,但由于这个游戏的窗口名是随角色名而改变的,要想达到通用的交易就无法使用findwindow来取窗口句柄。现在知道游戏进程名:main.exe那该怎么去找游戏的窗口句柄和进程ID呢E语言可以通过进程名轻松获取窗口句柄和进程ID,VB怎么就这么难呢!!!!希望大侠们帮忙解决下,小弟谢过! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用SPY++看一下类名是什么.或者直接enumwindow后再getwindowthreadprocessid,判断一下是不是目标进程内的窗口. 用API,FindWindow ,GetWindowThreadProcessId //定义一个进程ID和窗口句柄的结构体typedef struct tagWNDINFO{ DWORD dwProcessId; HWND hWnd;} WNDINFO, *LPWNDINFO;//枚举回调函数BOOL CALLBACK EnumWindsProc(HWND hWnd,LPARAM lParam){ DWORD dwProcessId; //通过窗口句柄获取进程ID GetWindowThreadProcessId(hWnd, &dwProcessId); LPWNDINFO pInfo = (LPWNDINFO)lParam; //匹配遍历窗口进程号与通过进程名得到的进程号 if(dwProcessId == pInfo->dwProcessId) { pInfo->hWnd = hWnd;//返回找到的窗口句柄 return FALSE; } return TRUE;}int GFindWindows(LPCTSTR proc_name,HWND *bufs, int buf_len){ int num=0;//返回的窗口句柄数目// bufs = new HWND[buf_len]; DWORD dwPID = 0; //一个临时PID int a[MAX_PATH];//存放进程PID的数组 DWORD Proc_num=0;//进程数量 CString procname(proc_name); //匹配进程名是否含 exe if (strcmp(procname.Right(procname.GetLength() - procname.ReverseFind('.') - 1),_T("exe"))) { return -1;//参数错误返回-1 } //************************根据进程名称获取进程ID***********// HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (INVALID_HANDLE_VALUE == hSnapshot) { return 0; } PROCESSENTRY32 pe = { sizeof(pe) }; BOOL fOk; for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe)) { CString temp; TRACE(("当前查找进程的名称是: %s\n"),pe.szExeFile); TRACE(("当前进程PID: %d \n"),pe.th32ProcessID); if (!_tcscmp(pe.szExeFile, proc_name)) { //CloseHandle(hSnapshot); temp.Format(("当前进程12PID: %d \n"),pe.th32ProcessID); TRACE(("当前匹配的进程PID: %d \n"),pe.th32ProcessID); a[Proc_num]= pe.th32ProcessID; Proc_num++; } } CString temp1; //进程数量为0 提示找不到进程 返回为0; if (Proc_num==0) { bufs=NULL; buf_len=0; return 0; }else//找到一个匹配进程 { //对一个进程名有多个相同进程ID的全部数组进行处理 for (int j=0;j<Proc_num;j++) { WNDINFO *wi=new WNDINFO; wi->dwProcessId =a[j];//将获取到的进程ID传给结构体 wi->hWnd = NULL; //遍历顶层窗口获取窗口句柄 EnumWindows(EnumWindsProc,(LPARAM)wi); //比较设定的大小与设计大小 if (num<buf_len) { //判断当前进程是否无窗口 无窗口句柄则不保存 if (wi->hWnd!=NULL) { bufs[num]=wi->hWnd; num++; } } } return num;//返回句柄个数 } } 通过Dos外部命令:TaskList来将系统中的所有进程都列出来,其中有进程的PID和进程名等信息。这个例子是通过API函数实现DOS外部命令的例子 本帖最后由 bcrun 于 2012-09-28 10:59:12 编辑 VB6中窗体控件随窗体缩放自动适应尺寸 这个问题也许有点复杂。。 希望大家齐心协力把它给剁拉:) 为什么删除不了! 滚支问题------> vb6中listbox如何绑定数据库? 如何判断IE的版本? 有没有这种消息提示控件 利用ado连接两个数据库的问题 如何在程序中实现映射网络驱动器,谢谢! 求助!请高手指教。 自动滑块拼图算法问题。 CAD 面积输出EXCEL程序
typedef struct tagWNDINFO
{
DWORD dwProcessId;
HWND hWnd;
} WNDINFO, *LPWNDINFO;//枚举回调函数
BOOL CALLBACK EnumWindsProc(HWND hWnd,LPARAM lParam)
{
DWORD dwProcessId;
//通过窗口句柄获取进程ID
GetWindowThreadProcessId(hWnd, &dwProcessId);
LPWNDINFO pInfo = (LPWNDINFO)lParam;
//匹配遍历窗口进程号与通过进程名得到的进程号
if(dwProcessId == pInfo->dwProcessId)
{ pInfo->hWnd = hWnd;//返回找到的窗口句柄
return FALSE;
}
return TRUE;
}int GFindWindows(LPCTSTR proc_name,HWND *bufs, int buf_len)
{ int num=0;//返回的窗口句柄数目
// bufs = new HWND[buf_len];
DWORD dwPID = 0; //一个临时PID
int a[MAX_PATH];//存放进程PID的数组
DWORD Proc_num=0;//进程数量
CString procname(proc_name);
//匹配进程名是否含 exe
if (strcmp(procname.Right(procname.GetLength() - procname.ReverseFind('.') - 1),_T("exe")))
{
return -1;//参数错误返回-1
} //************************根据进程名称获取进程ID***********//
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hSnapshot)
{
return 0;
}
PROCESSENTRY32 pe = { sizeof(pe) };
BOOL fOk;
for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe))
{
CString temp;
TRACE(("当前查找进程的名称是: %s\n"),pe.szExeFile);
TRACE(("当前进程PID: %d \n"),pe.th32ProcessID);
if (!_tcscmp(pe.szExeFile, proc_name))
{
//CloseHandle(hSnapshot);
temp.Format(("当前进程12PID: %d \n"),pe.th32ProcessID);
TRACE(("当前匹配的进程PID: %d \n"),pe.th32ProcessID);
a[Proc_num]= pe.th32ProcessID;
Proc_num++;
} }
CString temp1;
//进程数量为0 提示找不到进程 返回为0;
if (Proc_num==0)
{
bufs=NULL;
buf_len=0;
return 0; }else//找到一个匹配进程
{
//对一个进程名有多个相同进程ID的全部数组进行处理
for (int j=0;j<Proc_num;j++)
{
WNDINFO *wi=new WNDINFO;
wi->dwProcessId =a[j];//将获取到的进程ID传给结构体
wi->hWnd = NULL;
//遍历顶层窗口获取窗口句柄
EnumWindows(EnumWindsProc,(LPARAM)wi);
//比较设定的大小与设计大小
if (num<buf_len)
{
//判断当前进程是否无窗口 无窗口句柄则不保存
if (wi->hWnd!=NULL)
{
bufs[num]=wi->hWnd;
num++;
}
}
}
return num;//返回句柄个数 }
}
这个例子是通过API函数实现DOS外部命令的例子