本人想取一个游戏的窗口句柄和进程ID,但由于这个游戏的窗口名是随角色名而改变的,要想达到通用的交易就无法使用findwindow来取窗口句柄。现在知道游戏进程名:main.exe那该怎么去找游戏的窗口句柄和进程ID呢E语言可以通过进程名轻松获取窗口句柄和进程ID,VB怎么就这么难呢!!!!希望大侠们帮忙解决下,小弟谢过!

解决方案 »

  1.   

    用SPY++看一下类名是什么.或者直接enumwindow后再getwindowthreadprocessid,判断一下是不是目标进程内的窗口.
      

  2.   

    用API,FindWindow  ,GetWindowThreadProcessId
      

  3.   

    //定义一个进程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;//返回句柄个数 }

    }
      

  4.   

    通过Dos外部命令:TaskList来将系统中的所有进程都列出来,其中有进程的PID和进程名等信息。
    这个例子是通过API函数实现DOS外部命令的例子
      

  5.   

    本帖最后由 bcrun 于 2012-09-28 10:59:12 编辑