Win32 - 在创建窗口之前拦截窗口的更好方法

时间:2014-10-18 03:27:51

标签: c windows winapi

我正在尝试自动化外部Windows应用程序。目标是使这个应用程序启动最小化,而不显示任何活动的窗口/启动画面,也不会从其他应用程序中窃取焦点。

我在C上编写了一个小程序,它在循环中调用EnumWindows()并使用ShowWindow()来最小化所需的窗口。它非常快,在80%的情况下都有效。不幸的是,有时应用程序窗口仍然会在短时间内显示并窃取焦点。

拦截窗口的更好(肯定)方法是什么? 使用SetWindowsHookEx挂钩是唯一的选择吗?

1 个答案:

答案 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, ...);