好吧,我想在启动窗口后最小化窗口,但是它没有生效,我也不知道我在做什么错。您能否在下面的代码中指出错误?
除了打开一个窗口外,什么也没有发生。
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/