【发布时间】:2016-05-11 10:02:31
【问题描述】:
好吧,我想在启动窗口后最小化窗口,但它没有生效,我不知道我做错了什么。能否请您指出下面代码中的错误?
除了打开一个窗口之外什么都没有发生。
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);
该代码应该最小化窗口,但我不知道为什么没有。
【问题讨论】:
-
我没有看到任何对 MinimizeWindow 的调用。 (我看到了对 CloseWindow 的调用 - 但这应该只是关闭它,最小化)。您必须调试您的 GetHwndFromPID。
-
@MegRay 你确定你检索到了正确的窗口句柄吗?尝试使用“Spy++”工具检查句柄值。另外,您没有检查来自
WaitForInputIdle的输出,可能发生超时... -
@MartinBonner 没有
MinimizeWindow()和CloseWindow()minimizes。 (它变得更奇怪了,而不是UnminimizeWindow()或RestoreWindow()它是OpenIcon()。)我猜两者的现代方法是使用ShowWindow(),但我不确定。 (这可能不会解决 OP 的问题;我不知道解决方案是什么,而且 IInspectable 可能还是有它。) -
@MegRay:您是否有理由尝试使用
CloseWindow(),而不是使用官方方法来请求生成的应用程序最小化运行?将STARTUPINFO结构传递给CreateProcess(),其中dwFlags设置为STARTF_USESHOWWINDOW,wShowWindow根据需要设置为SW_MINIMIZE、SW_SHOWMINIMIZED或SW_SHOWMINNOACTIVE。wShowWindow值将在生成的进程第一次为自己调用ShowWindow()时生效。这是记录在案的行为。 -
如果程序创建了多个窗口怎么办?除了主窗口之外,大多数程序还会创建一堆帮助窗口。你的程序只是抓取第一个窗口,它可能是一个工具提示或其他一些帮助窗口。