当前位置:编程学习 > VB >>

通过进程名取窗口句柄和进程ID的问题!~!~!~!~!~!~!

本人想取一个游戏的窗口句柄和进程ID,但由于这个游戏的窗口名是随角色名而改变的,要想达到通用的交易就无法使用findwindow来取窗口句柄。

现在知道游戏进程名:main.exe

那该怎么去找游戏的窗口句柄和进程ID呢

E语言可以通过进程名轻松获取窗口句柄和进程ID,VB怎么就这么难呢!!!!

希望大侠们帮忙解决下,小弟谢过!
--------------------编程问答-------------------- 用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外部命令的例子 --------------------编程问答-------------------- --------------------编程问答-------------------- VS 假三上上左下

全部代码 --------------------编程问答-------------------- 高手。。
补充:VB ,  基础类
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,