比如魔兽争霸是全屏运行看不到标题栏。。我要用FindWindow获得war3的窗口句柄,到哪去找到标题文字来?

解决方案 »

  1.   

    - -!、、根据楼主的问题 我以为 是在不知道句柄的情况下 要去获取一个窗体的标题
    咋进来一看 貌似楼主是想根据 窗体标题去找句柄呢
    还有 话说 大概 貌似 记得 FindWindow(类名,标题名)用用类名查找啊
      

  2.   

    你用GetWindowText会得到什么值?
      

  3.   

    EnumProcesses();得到进程ID
    EnumWindows();/GetWindowThreadProcessId();枚举窗口,然后得到ID,和上面的比对,如果ID相等,即找到该HWND窗口句柄
      

  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); //输出结果
    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;
    }
      

  5.   


    “//输出结果”中使用的那个句柄“hwnd”应该就是楼主需要的那个句柄吧。