一个网游的窗口,句柄被隐藏了试过用GetForeGround,WindowFromPoint,EnumWindow
都没办法获取句柄。但是在spy++里却能找到这个句柄。求问如何在程序里找到句柄?

解决方案 »

  1.   

    spy++是不是通过进程获取的窗口句柄呢?
    这个窗口的进程能找到。求问如何通过进程获取句柄?我在用C#,最好给出C#的dllimport语句。
      

  2.   

    SPY++是通过WindowFromPoint函数,得到窗口句柄的,你可以考虑用这个函数试试先得到鼠标位置,然后用WindowFromPoint返回鼠标位置处的窗口句柄
      

  3.   


    我试过了,windowfrompoint无法获取这个窗口的句柄
      

  4.   

    通过进程获取窗体句柄。
    #include "Psapi.h"
    #pragma comment(lib, "Psapi.lib")BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);
    BOOL ComparProcessnameById(DWORD processID, LPCTSTR pName);void CGetProcessUserDlg::OnBnClickedButtonGetwindowtext()
    {
        TCHAR tmp[MAX_PATH];
        memset(tmp,0,MAX_PATH);
        wcscpy(tmp,_T("notepad.exe"));    //打开一个记事本程序,你也可以手动打开一个,用来枚举这个程序,当然也可以是任意程序.
        //这两行代码仅用来示例,实际使用时无需这两行。
        ShellExecute(NULL,_T("open"),tmp,NULL,NULL,SW_MINIMIZE);
        Sleep(1000);    //获取“记事本”的进程ID
        DWORD aProcesses[1024], cbNeeded, cProcesses;
        unsigned int i;
        if (EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded ))
        {
            cProcesses = cbNeeded / sizeof(DWORD);
            for (i = 0; i < cProcesses; i++)
                if( aProcesses[i] != 0 )
                    if (TRUE == ComparProcessnameById(aProcesses[i], tmp))
                        EnumWindows(EnumWindowsProc,aProcesses[i]);    }
    }BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
    {
        TCHAR tWindowText[256],tWindowClassName[256];
        DWORD dwID = -1;    //获得该“窗体”的进程ID
        GetWindowThreadProcessId(hwnd,&dwID);
        if (dwID == lParam)
        {
            //由于该进程ID下的所有窗体都将被枚举到,而我们只需要主窗体的Text;
            //使用spy++查看主窗体的“类名”,与之匹配的才是我们需要的。
            GetClassName(hwnd,tWindowClassName,256);
            if (0 == _tcscmp(tWindowClassName,_T("Notepad")))
            {
                memset(tWindowText,0,256);
                GetWindowText(hwnd,tWindowText,256);//////////////这里用到的hwnd就是你要找到的目标窗口的句柄。            //输出结果
                TCHAR tmp[256];
                memset(tmp,0,256);
                _stprintf(tmp,_T("%s\n"),tWindowText);
                OutputDebugString(tmp);
            }
        }
        return TRUE;
    }BOOL ComparProcessnameById(DWORD processID, LPCTSTR pName)
    {
        TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");    // 获得进程的句柄
        HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE, processID);    // 获得进程名称
        if (NULL != hProcess )
        {
            HMODULE hMod;
            DWORD cbNeeded;        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
            {
                GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
                if (0 == _tcscmp(szProcessName,pName))
                    return TRUE;
            }
        }
        CloseHandle( hProcess );    return FALSE;
    }
    “//输出结果”中使用的那个句柄“hwnd”应该就是楼主需要的那个句柄吧
      

  5.   

    但是spy++就是这个原理
    是不是你具体操作的时候有错误
    还没听说有什么可以隐藏窗口句柄的方法
      

  6.   

    如果知道窗口的标题,可以通过FindWindow来查找.
      

  7.   

    你这个程序是不是directUI的
    压根没有句柄
      

  8.   


    事实上有句柄。从spy++里能够看到。但是这个程序被驱动保护了,只接受驱动发来的消息。我遍历了下1-1000的消息,发现这个程序在应用层面,只在接受窗口改变大小的消息。