我正在寻找一种强制窗口设置我使用 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标志。
那么如何获得良好的窗口处理?还有另一种方法可以强制我运行的程序显示其主窗口吗? 或者任何想法?