替换睡眠,直到桌面上的窗口打开

时间:2014-01-31 12:55:24

标签: c++ windows winapi

当我打开一些软件应用程序时,我必须等待2-3秒,直到窗口显示在桌面上。我必须使用Sleep(2000);然后调用方法集总是在顶部。我正试图在我的代码中替换Sleep。我想从打开的窗口获取信号,然后调用一个方法,允许打开的窗口始终位于顶部。 这是我的代码:

BOOL CALLBACK EnumWindowsProc(HWND windowHandle, LPARAM lParam)
{

    DWORD searchedProcessId = (DWORD)lParam;
    DWORD windowProcessId = 0;
    GetWindowThreadProcessId(windowHandle, &windowProcessId);
    cout << "Process id: " << windowProcessId << endl;


    if(searchedProcessId == windowProcessId) {
        HWND hwnd = windowHandle;

        Sleep(2000);                    
        SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
        cout << "Process ID found!" << endl;

        return TRUE;
    }
    return TRUE;
}

void AlwaysOnTop(int processId)
{
        EnumWindows(&EnumWindowsProc, (LPARAM)processId);   
}


void AlwaysOnTop(char *name)
{

        cout << "String: " << name << endl;

        Sleep(2000);
        HWND h = FindWindow(NULL, (LPCSTR) name);
        SetActiveWindow(h); 
        SetForegroundWindow(h);
        SetWindowPos(h, HWND_TOPMOST, 0,0,0,0, SWP_NOSIZE | SWP_NOMOVE);

}



int main()
{

    char s[] = {"Application"};

    AlwaysOnTop(s);
    //AlwaysOnTop(2307);

    system("PAUSE");
    return 0;
}

1 个答案:

答案 0 :(得分:2)

您可以做的最好的事情就是致电WaitForInputIdle

  

等待指定的进程完成处理其初始输入并等待没有输入待处理的用户输入,或等待超时间隔结束。

这是您可以通过一般方式等待进程显示其UI的最接近的方法。它并不总能做你想要的,但它是最好的。