好吧,我想在启动窗口后最小化窗口,但是它没有生效,我也不知道我在做什么错。您能否在下面的代码中指出错误?

除了打开一个窗口外,什么也没有发生。

HWND  g_hwnd;
int  g_nFound;

BOOL CALLBACK FindHwndFromPID(HWND hwnd, LPARAM lParam);

HWND GetHwndFromPID(DWORD dwProcessId)
{
g_hwnd = NULL;
g_nFound = 0;

EnumWindows(FindHwndFromPID, (LPARAM)dwProcessId);

if (g_hwnd)  // we found one...
    return (g_hwnd);

// nothing found :-(

return (NULL);
}

BOOL CALLBACK FindHwndFromPID(HWND hwnd, LPARAM lParam)
{
DWORD   dwPID2Find = (DWORD)lParam;
DWORD   dwPID = 0;

if (GetWindowThreadProcessId(hwnd, &dwPID))
{
    if (dwPID == dwPID2Find)
    {
        g_hwnd = hwnd;


        return  (FALSE);
    }
}

return  (TRUE);
}


 int main
 {
     ..../
 if (!CreateProcessA(NULL,     // No module name (use command line)
     command_line.GetBuffer(),
     NULL,           // Process handle not inheritable
     NULL,           // Thread handle not inhberitable
     FALSE,          // Set handle inheritance to FALSE
     0,              // No creation flags
     NULL,           // Use parent's environment block
     NULL,           // Use parent's starting directory
     &si,            // Pointer to STARTUPINFO structure
     &pi)           // Pointer to PROCESS_INFORMATION structure
     )
 {

     //... error handling
     return 0;
 }

 WaitForInputIdle(pi.hProcess, 1000);
 HWND hwnds = GetHwndFromPID(pi.dwProcessId);

 printf("Process Handle %d, hwnd id: %p ",pi.dwProcessId, hwnds);

 CloseWindow(hwnds);


该代码应该最小化窗口,但我不知道为什么不这样做。

最佳答案

您正在以错误的方式进行操作。正式要求已生成的进程最初最小化运行的正式方法是在调用STARTUPINFO时使用CreateProcess()结构,例如:

int main()
{
    STARTUPINFO si;
    ZeroMemory(&si, sizeof(si));
    si.cbSize = sizeof(si);
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_MINIMIZE;

    //...

    if (!CreateProcessA(..., &si, ...))
    {
        //... error handling
        return 0;
    }

    //...

    return 0;
}


STARTUPINFO structure


  wShowWindow
  如果dwFlags指定STARTF_USESHOWWINDOW,则该成员可以是ShowWindow函数的nCmdShow参数中可以指定的任何值,SW_SHOWDEFAULT除外。否则,将忽略此成员。
  
  对于GUI进程,第一次调用ShowWindow时,将忽略其nCmdShow参数wShowWindow指定默认值。在随后的ShowWindow调用中,如果ShowWindow的nCmdShow参数设置为SW_SHOWDEFAULT,则使用wShowWindow成员。


ShowWindow function


  nCmdShow [输入]
  类型:int
  
  控制窗口的显示方式。如果启动应用程序的程序提供了STARTUPINFO结构,则在应用程序首次调用ShowWindow时将忽略此参数。否则,第一次调用ShowWindow时,该值应为WinMain函数在其nCmdShow参数中获得的值。
  
  ...
  
  应用程序第一次调用ShowWindow时,应使用WinMain函数的nCmdShow参数作为其nCmdShow参数。对ShowWindow的后续调用必须使用给定列表中的值之一,而不是WinMain函数的nCmdShow参数指定的值。
  
  如对nCmdShow参数的讨论中所述,如果启动应用程序的程序在结构中指定了启动信息,则在第一次调用ShowWindow时将忽略nCmdShow值。在这种情况下,ShowWindow使用STARTUPINFO结构中指定的信息来显示窗口。在后续调用中,应用程序必须使用nCmdShow设置为SW_SHOWDEFAULT来调用ShowWindow,以使用启动应用程序的程序提供的启动信息。此行为是针对以下情况设计的:
  
  •应用程序通过调用设置了WS_VISIBLE标志的CreateWindow来创建其主窗口。
  
  •应用程序通过清除WS_VISIBLE标志的调用CreateWindow来创建其主窗口,然后再将SW_SHOW标志设置为可见来调用ShowWindow。

关于c++ - CloseWindow不会从我刚启动的过程中最小化窗口,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35156185/

10-11 18:10