【问题标题】:how to make CreateProcess open new process in focus and not in background [duplicate]如何使CreateProcess在焦点中而不是在后台打开新进程[重复]
【发布时间】:2026-01-20 22:05:02
【问题描述】:

我创建了一个非常简单的 Win 程序。它打开记事本并在 5 秒后打开 calc。 问题是第一个程序总是在后台打开而不是焦点(见图)。第二个程序以焦点打开。我一直在想这个问题,我不知道为什么会发生,也不知道如何打开第一个焦点程序。

我正在使用带有默认 Windows 应用程序设置的 Visual Studio 2013。

编辑:这不是一个重复的问题,我在这里要问的是为什么同一个 CreateProcess() 函数会在后台创建一次进程并在焦点中创建一次!

#include <Windows.h>


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    STARTUPINFO si = { 0 };
    PROCESS_INFORMATION pi = { 0 };
    si.cb = sizeof(si);
    CreateProcess(L"c:\\windows\\system32\\notepad.exe", NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);

    Sleep(5000);

    STARTUPINFO si2 = { 0 };
    PROCESS_INFORMATION pi2 = { 0 };
    si2.cb = sizeof(si2);
    CreateProcess(L"c:\\windows\\system32\\calc.exe", NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si2, &pi2);

    return 0;
}

【问题讨论】:

    标签: c++ winapi createprocess winmain


    【解决方案1】:

    找到了解决这个问题的方法,很奇怪,我不知道为什么会这样,但它确实有效。

    如果我添加:

    MSG msg;
    TranslateMessage(&msg);
    

    在 WinMain 中,然后我创建的进程获得焦点,很奇怪。有人可以解释它为什么起作用吗?

    【讨论】:

    • 我在程序员的 stackexchange 上为此创建了一个question
    • 你应该初始化msg,否则你将一个未初始化的对象传递给一个API函数。当我们有MSG msg = { 0 }; 并且可能更可靠时,这个技巧仍然有效。如果它未初始化,您永远不会知道:也许它在大多数情况下都可以工作,但 TranslateMessage 函数有时会不喜欢 msg 中的特定垃圾位模式,并在解决方法效果发生之前抛出一个 fit。
    最近更新 更多