通过窗口名称取得句柄是
\\暴风影音的窗口句柄
HWND TheWindow;
TheWindow = FindWindow(NULL,"media player classic");那么通过映像名称取得句柄应该怎么写。还拿暴风影音来举例,暴风影音的映像名称是mplayerc.exe,请给出代码。
请不要随便找个地方Ctrl c,然后Ctrl v来回答。

解决方案 »

  1.   

    BOOL CALLBACK GetProcWindowsProc(HWND hwnd, LPARAM lParam)
    {
    DWORD dwProcId = 0;
    if (GetWindowThreadProcessId(hwnd, &dwProcId))
    {
    if (dwProcId == lParam)
    {
    //得到该窗口句柄
    dosomething...
    return FALSE;
    }
    }
    return TRUE;
    }
    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;
    TCHAR szMyProc[] = L"mplayerc.exe"; if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
    return;
    cProcesses = cbNeeded / sizeof(DWORD);
    for ( i = 0; i < cProcesses; i++ )
    {
    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
    PROCESS_VM_READ,
    FALSE, aProcesses[i] );
    if (NULL != hProcess )
    {
    DWORD dwRet = 0;
    TCHAR szProcessName[MAX_PATH] = L"unknown";
    dwRet = GetProcessImageFileName(hProcess,szProcessName,MAX_PATH);
    if (0!=dwRet)
    {
    CString strProcName = szProcessName;
    CString strTemp = strProcName.Right(wcslen(szMyProc));
    if (!strTemp.Compare(szMyProc))
    {
    EnumWindows(GetProcWindowsProc,aProcesses[i]);
    }
    }
    } }
      

  2.   

    OpenProcess后忘了写CloseHandle( hProcess ),你自己加一下
      

  3.   

    /****************************************************************************
    我这个跟楼上的差不多,但我是先枚举窗口,再比较映射名的
    1.以下的方法是通过枚举窗口找到具有映射名的窗口,但窗口不只一个,你再自己判断一下是哪个吧
    2.愿顺利。阿弥陀佛!
    ****************************************************************************/
    步骤一:
    #pragma   comment(lib,"psapi")   
    #include "PSAPI.H"
    步骤二:
    枚举所以窗口
    BOOL CALLBACK EnumWindowsProc(HWND hWnd,LPARAM lParam)
    {
    if ( GetParent(hWnd)==NULL  &&  IsWindowVisible(hWnd) )
    {
    DWORD   dwProcId; //进程ID   
    GetWindowThreadProcessId(hWnd,   &dwProcId);   //由窗口句柄获得进程ID
    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE, dwProcId); TCHAR szProcessName[MAX_PATH] ={0}; //进程的名称
    TCHAR szProcessPath[MAX_PATH] ={0}; //进程路径 if (hProcess!=NULL) 
    {
    HMODULE hMod=NULL;
    DWORD ModulecbNeeded;
    if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &ModulecbNeeded) )
    { if (    GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName) ) //获得程序名
    && GetModuleFileNameEx( hProcess, hMod, szProcessPath, sizeof(szProcessPath))  )//获得模块路径
    {
    // trace2(szProcessPath,szProcessName);

    //在这里我们获取了一个或更多个窗口,他们都属于名为szProcessName的进程
    //剩下的工作你就自己判断这几个窗口哪个才是主窗口
    if ( 0==strcmp((char*)lParam,szProcessName) )
    {
    trace(szProcessName);// CloseHandle(hProcess);
    // return FALSE;
    }
    }
    }
    }
    CloseHandle(hProcess);
    }
    return true;   
    }
      

  4.   

    oldforest你写的代码能注解一下吗?我看了有点头晕
    jacky_qiu朋友写的没有用到题目中的映像名称啊我都不知道加在什么地方。。
    最好能给出具体思路,尽可能详细一些。如:先用XXX函数打开得到进程ID,然后用XXX函数把得到的进程ID再干什么。。
      

  5.   


        DWORD aProcesses[1024], cbNeeded, cProcesses;
        unsigned int i;
        TCHAR szMyProc[] = L"mplayerc.exe";    //枚举所有的进程
        if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
            return;
        cProcesses = cbNeeded / sizeof(DWORD);
        for ( i = 0; i < cProcesses; i++ )
        {
            //打开每个进程,判断进程映象名是否和mplayerc.exe相匹配
            HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                PROCESS_VM_READ,
                FALSE, aProcesses[i] );
            if (NULL != hProcess )
            {
                DWORD dwRet = 0;
                TCHAR szProcessName[MAX_PATH] = L"unknown";
                dwRet = GetProcessImageFileName(hProcess,szProcessName,MAX_PATH);
                if (0!=dwRet)
                {
                    CString strProcName = szProcessName;
                    CString strTemp = strProcName.Right(wcslen(szMyProc));
                    if (!strTemp.Compare(szMyProc))
                    {
                        //找到和mplayerc.exe相匹配的的进程,接下来枚举系统中所有窗口,
                           //并判断窗口所在的进程和所找到的进程是否是同一个
                        EnumWindows(GetProcWindowsProc,aProcesses[i]);
                    }
                }
            }
            CloseHandle( hProcess )
        }