以下代码运行时10次至少有1次无法找到进程主窗口,问题在哪?BOOL CALLBACK EnumWindowCallBack(HWND hWnd, LPARAM lParam)  
{  
    ProcessWindow *pProcessWindow = (ProcessWindow *)lParam;  
  
    DWORD dwProcessId;  GetWindowThreadProcessId(hWnd, &dwProcessId);      if (pProcessWindow->dwProcessId == dwProcessId && IsWindow(hWnd) && GetParent(hWnd) == NULL) 
    {  
        pProcessWindow->hwndWindow = hWnd;  
        return FALSE;
    }  
    return TRUE;  
}  BOOL MyCreateProcess()
{
    STARTUPINFO si;  
    memset(&si, 0, sizeof(STARTUPINFO));  
    si.cb = sizeof(STARTUPINFO);  
    si.dwFlags = STARTF_USESHOWWINDOW;  
    si.wShowWindow = SW_SHOW;  
  
    // 进程信息  
    PROCESS_INFORMATION pi;  
    if(CreateProcess(L"E:\\test.exe", NULL, NULL, NULL, false, 0, NULL, NULL, &si, &pi))  
    {  
        ProcessWindow procwin;  
        procwin.dwProcessId = pi.dwProcessId;  
        procwin.hwndWindow = NULL;  
  
        WaitForInputIdle(pi.hProcess, 5000);  
        EnumWindows(EnumWindowCallBack, (LPARAM)&procwin);  
        g_hTestWnd = procwin.hwndWindow;
    }
    else
g_hTestWnd = NULL;
    return (g_hTestWnd?TRUE:FALSE);
}

解决方案 »

  1.   

    #include "stdafx.h"
    #include "afxwin.h"HWND g_hTestWnd;typedef struct tage
    {
    DWORD dwProcessId;
    HWND hwndWindow;
    }ProcessWindow;BOOL CALLBACK EnumWindowCallBack(HWND hWnd, LPARAM lParam)  
    {  
        ProcessWindow *pProcessWindow = (ProcessWindow *)lParam;  
      
        DWORD dwProcessId;  GetWindowThreadProcessId(hWnd, &dwProcessId);      if (pProcessWindow->dwProcessId == dwProcessId && IsWindow(hWnd) && GetParent(hWnd) == NULL) 
        {  
            pProcessWindow->hwndWindow = hWnd;  
            return FALSE;
        }  
        return TRUE;  
    }  BOOL MyCreateProcess()
    {
        STARTUPINFO si;  
        memset(&si, 0, sizeof(STARTUPINFO));  
        si.cb = sizeof(STARTUPINFO);  
        si.dwFlags = STARTF_USESHOWWINDOW;  
        si.wShowWindow = SW_SHOW;  
      
        // 进程信息  
        PROCESS_INFORMATION pi;  
        if(CreateProcess("c:\\windows\\notepad.exe", NULL, NULL, NULL, false, 0, NULL, NULL, &si, &pi))  
        {  
            ProcessWindow procwin;  
            procwin.dwProcessId = pi.dwProcessId;  
            procwin.hwndWindow = NULL;  
      
            WaitForInputIdle(pi.hProcess, 5000);  
            EnumWindows(EnumWindowCallBack, (LPARAM)&procwin);  
            g_hTestWnd = procwin.hwndWindow;
        }
        else
        g_hTestWnd = NULL;
        return (g_hTestWnd?TRUE:FALSE);
    }
    int main(int argc, char* argv[])
    {
    BOOL r = MyCreateProcess(); printf( "r = %d\r\n", r ); return 0;
    }
    没发现问题,有的时候慢倒是。