【问题标题】:create an independent hidden process创建一个独立的隐藏过程
【发布时间】:2009-11-30 14:59:37
【问题描述】:

我正在使用以下代码创建一个隐藏其主窗口的应用程序:

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)的情况下创建另一个进程?

我的猜测是我的应用正在失去焦点,因为它被赋予了新进程,即使它被隐藏了。

对于那些好奇的人肯定会问通常的“你为什么要这样做”,我的回答是因为我有一个不能作为服务的看门狗进程,它会在我打开我的主应用程序时启动.满意吗?

感谢您的帮助。代码将不胜感激。 杰斯。

【问题讨论】:

    标签: c winapi createprocess


    【解决方案1】:

    您正在运行的应用程序正在获取窗口焦点。

    解决此问题的一种方法是在新桌面中启动新进程。这将防止应用程序窃取您桌面上的窗口焦点。

    在新桌面上运行进程的代码应如下所示:

    HDESK hOld = GetThreadDesktop( GetCurrentThreadId() );
    HDESK hNew = OpenDesktop( "name", 0, FALSE, GENERIC_ALL );
    SetThreadDesktop( hNew );
    CreateProcess( ... );
    SetThreadDesktop( hOld );
    CloseDesktop( hNew );
    

    【讨论】:

      【解决方案2】:

      很明显,目标应用程序不支持 ShowWindow 标志。您需要修复启动的应用程序,使其不会贪婪。

      【讨论】:

      • 谢谢。启动的应用程序以尽可能低的优先级运行。你还能做什么?
      • 它与优先级无关。除非另一个窗口尝试激活,否则 Windows 将永远不会从一个窗口激活(并因此获得焦点)。这意味着,您的所有 SW_HIDE 提示都相反 - 应用程序正在尝试激活顶级窗口。将 WM_ACTIVATE 处理程序添加到您的主窗口并对其进行断点,然后窗口会告诉您窃贼窗口的 hwnd。
      • 好的。我必须知道如何捕获该特定消息,但我会尝试找出答案。你知道怎么做吗?
      • 启动应用程序有一个失去焦点/激活的窗口是吗?如果您使用 MFC 之类的框架,此窗口将有一个 WindowProc / 某种消息处理程序。您需要找到 windowproc 或消息映射,并为 WM_ACTIVATE 或 OnActivate 添加一个处理程序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      相关资源
      最近更新 更多