ShellExecuteEx()强制窗口到顶部z顺序

时间:2013-11-19 18:19:39

标签: c winapi window

我正在寻找一种强制窗口设置我使用 ShellExecuteEx()在z顺序中首先启动的程序的方法。

问题的根源是机器(只有一个)和谷歌浏览器的问题 当我使用以下参数从 ShellExecuteEx()启动Chrome时:

  

http://www.google.fr --kiosk --fast-start --chrome-frame

它不显示窗口,但我看到栏中的Chrome图标闪烁。

我尝试使用 EnumWindows() BringWindowToTop()然后使用* HWND_TOPMOST *标志 SetWindowPos()强制使用该窗口但这对我尝试的所有程序都不起作用。

Actualy我通过比较pids来获得 HWND

BOOL CALLBACK   SetWindowToTopFromhProcess(HWND hwnd, LPARAM lParam)
{
    HANDLE      hProcess = (HANDLE)lParam;
    DWORD       win_pid = 0;
    DWORD       pid = 0;
    char        buf[512];

    pid = GetProcessId(hProcess);
    GetWindowThreadProcessId(hwnd, &win_pid);
    if (pid == win_pid && pid != 0 && win_pid != 0)
    {
        //SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE);
        BringWindowToTop(hwnd);

        memset(&buf, 0, sizeof(buf));
        GetWindowText(hwnd, buf, sizeof(buf));
        printf("%s\n", buf);

        return (FALSE);
    }
    return (TRUE);
}

int                     my_function()
{
    SHELLEXECUTEINFO    ExecuteInfo;

    ...
    ExecuteInfo.nShow = SW_SHOWNORMAL;
    ...
    if (ShellExecuteEx(&ExecuteInfo))
        EnumWindows(SetWindowToTopFromhProcess, (LPARAM)ExecuteInfo.hProcess);
    ...
}

顺便说一句,我已经意识到我从pid获取的窗口句柄并不总是我想要的句柄。例如,对于mspaint.exe,我检索的窗口名称是“GDI + Window”,因此它不是好窗口,因为它不是好的pid。

我也在 SHELLEXECUTEINFO 结构中尝试了很多不起作用的nShow标志。

那么如何获得良好的窗口处理?还有另一种方法可以强制我运行的程序显示其主窗口吗? 或者任何想法?

0 个答案:

没有答案