我正在使用以下代码创建一个隐藏其主窗口的应用程序:
STARTUPINFO siStartupInfo;
PROCESS_INFORMATION piProcessInfo;
memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));
siStartupInfo.cb = sizeof(siStartupInfo);
siStartupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_FORCEOFFFEEDBACK | STARTF_USESTDHANDLES;
siStartupInfo.wShowWindow = SW_HIDE;
if(CreateProcess(MyApplication, "", 0, 0, FALSE, 0, 0, 0, &siStartupInfo, &piProcessInfo) == FALSE)
{
// blah
return 0;
}
除了我的主应用程序(调用此代码的应用程序)窗口在打开新程序时失去焦点,一切正常。 我尝试降低新流程的优先级,但焦点问题仍然存在。
无论如何要避免这种情况吗?此外,有没有办法创建另一个进程而不使用CreateProcess(或任何调用CreateProcess的API,如ShellExecute)?
我的猜测是我的应用程序正在失去焦点,因为它被赋予了新进程,即使它被隐藏了。
对于那些好奇的人肯定会问通常的“你为什么要这样做”,我的回答是因为我有一个看门狗进程,它不能成为一个服务,每当我打开我的主应用程序时它就会启动。满意吗?
感谢您的帮助。代码将不胜感激。 杰斯。
答案 0 :(得分:0)
显然,目标应用程序不支持ShowWindow标志。您需要修复已启动的应用程序,以使其不贪婪。
答案 1 :(得分:0)
您正在运行的应用程序正在关注窗口。
解决此问题的一种方法是在新桌面中启动新进程。这样可以防止应用程序将窗口重点放在桌面上。
在新桌面上运行进程的代码应如下所示:
HDESK hOld = GetThreadDesktop( GetCurrentThreadId() );
HDESK hNew = OpenDesktop( "name", 0, FALSE, GENERIC_ALL );
SetThreadDesktop( hNew );
CreateProcess( ... );
SetThreadDesktop( hOld );
CloseDesktop( hNew );