1

我在 Windows 7 上创建了一个计划任务,它以指定的时间间隔运行批处理文件。

该批处理文件依次调用 Perl 脚本。在 Perl 脚本中,根据结果,我使用 Perl Tk 显示一个弹出消息,该消息给出一个警报。

现在,当我在我的机器上执行一些其他任务时,例如浏览 Internet,浏览器窗口将成为活动窗口。在这之间,计划任务运行并且不显示弹出窗口,而是将其最小化并显示在任务栏上。

请注意,我正在使用来自 ntwind 的 htstart.exe,以避免在计划任务运行时显示控制台窗口(否则,每次计划任务运行时都会显示 taskeng.exe)。

为了使我的 Perl Tk 窗口成为活动窗口,我正在创建如下所示的窗口:

$mw = MainWindow->new(-background => 'blue');
$mw->focus(-force);
$mw->geometry("200x200");
$mw->title("Message");

我已设置焦点选项,以便此窗口变为活动状态。

现在,当计划任务运行时,我在设置焦点选项后观察到的唯一区别是,Tk 窗口出现在任务栏中并且一直闪烁(可能是因为它现在被设置为活动窗口)。

我如何确保它在显示时出现在前台并且不会最小化到任务栏?

谢谢。

4

1 回答 1

1

您不能在 Windows 上始终如一地执行此操作。问题在于,在所有情况下,对操作系统的底层调用都不会强制将焦点放在特定窗口上。从该页面:

系统限制哪些进程可以设置前台窗口。只有当下列条件之一为真时,进程才能设置前台窗口:

  • 该进程是前台进程。
  • 该进程由前台进程启动。
  • 进程收到最后一个输入事件。
  • 没有前台进程。
  • 正在调试前台进程。
  • 前景未锁定(请参阅LockSetForegroundWindow)。
  • 前台锁定超时已过期(参见 参考资料SPI_GETFOREGROUNDLOCKTIMEOUTSystemParametersInfo
  • 没有菜单处于活动状态。

当用户正在使用另一个窗口时,应用程序不能将一个窗口强制到前台。相反,Windows 会闪烁窗口的任务栏按钮以通知用户。

从用户的角度来看,这很有意义。让弹出窗口窃取您的焦点非常烦人,因为它可能导致错误的击键。但这确实意味着您想要做的事情不会起作用(也不应该起作用),因此您将不得不忍受它。

于 2012-08-20T06:46:11.193 回答