C ++ CreateProcess SW_HIDE firefox,chrome,safari

时间:2010-12-13 18:12:30

标签: c++ firefox createprocess

我正在为使用多个浏览器来测试Web应用程序的Windows编写Web测试框架。 我想隐藏启动浏览器,但它不起作用。

我正在使用CreateProcess来启动带有SW_HIDE标志的浏览器

STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
CreateProcess(NULL, const_cast<char*> (cmd.c_str()) , NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);

它适用于Internet Explorer和其他应用程序,但使用firefox和其他浏览器失败。 我知道一个进程能够选择是否遵循传递的标志。有什么方法可以强迫它开始隐藏吗?

我可以等到窗口出现然后通过打开窗口的句柄来隐藏它。但我正在寻找更清洁的解决方案。

5 个答案:

答案 0 :(得分:1)

问题是只有在使用命令wShowWindow调用函数ShowWindow时才使用SW_SHOWDEFAULT的值,另外FastAl表示浏览器会创建一些额外的进程以执行其他操作任务。
根据您的想法和FastAl的答案,您可以这样做来隐藏您创建的进程创建的窗口:
1.-创建一个流程列表:CreateToolhelp32SnapshotProcess32FirstProcess32NextCloseHandle;仅采用您创建的流程创建的流程。 Here是如何使用此功能的演示,它适用于除Windows NT之外的任何Windows版本 2.-使用EnumWindows枚举屏幕上的窗口,并使用GetWindowThreadProcessId检查窗口是否是由上一步骤中恢复的任何过程创建的。
3.-如果窗口是由步骤1中定义的过程之一创建的;使用ShowWindow函数隐藏窗口 您可以监视由您创建的进程并检查是否创建了新的进程/窗口。

答案 1 :(得分:0)

您可以从服务启动进程(例如作为NETWORK SERVICE用户运行)。这将阻止他们显示任何UI。然而,即使你想要在以后的某个时间,它也会阻止你看到ui。

另一个选择是对Window Stations和Desktops做一些事情,看一下section about Window Stations and Desktops on MSDN。一个想法是使用CreateDesktop,然后将此桌面指定为给予CreateProcess的STARTUPINFO结构中的lpDesktop参数。如果您以后想要显示用户界面,请使用SwitchDesktop

答案 2 :(得分:0)

尝试si.wShowWindow = 0; 有趣的是这对我有用,而不是SW_HIDE,它应该具有相同的价值。

答案 3 :(得分:0)

您可以启动该应用程序,然后将WM_SIZE消息发送到其主窗口。

http://msdn.microsoft.com/en-us/library/ms632646(v=vs.85).aspx

答案 4 :(得分:-1)

根据MSDN,看起来你需要在dwFlags中传递这个标志。

STARTF_USESHOWWINDOW 0x00000001 - The wShowWindow member contains additional information.