我正在尝试自动化外部Windows应用程序。目标是使这个应用程序启动最小化,而不显示任何活动的窗口/启动画面,也不会从其他应用程序中窃取焦点。
我在C上编写了一个小程序,它在循环中调用EnumWindows()并使用ShowWindow()来最小化所需的窗口。它非常快,在80%的情况下都有效。不幸的是,有时应用程序窗口仍然会在短时间内显示并窃取焦点。
拦截窗口的更好(肯定)方法是什么? 使用SetWindowsHookEx挂钩是唯一的选择吗?
答案 0 :(得分:3)
在启动应用程序时,您是否尝试使用STARTUPINFO
structure wShowWindow
成员传递给CreateProcess()
?那是为了完成这样的事情。
如果dwFlags指定STARTF_USESHOWWINDOW,则此成员可以是ShowWindow函数的nCmdShow参数中可以指定的任何值,SW_SHOWDEFAULT除外。否则,该成员将被忽略。
对于GUI进程,第一次调用ShowWindow时,将忽略其nCmdShow参数wShowWindow指定默认值。在后续对ShowWindow的调用中,如果ShowWindow的nCmdShow参数设置为SW_SHOWDEFAULT,则使用wShowWindow成员。
例如:
STARTUPINFO si = { sizeof(si) }
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_MINIMIZE;
CreateProcess(..., &si, ...);