Perl Tk活动窗口

时间:2012-08-18 04:52:09

标签: perl tk

我在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窗口出现在任务栏中并且它一直闪烁(可能是因为它现在被设置为活动窗口)。

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

感谢。

1 个答案:

答案 0 :(得分:1)

您不能在Windows上一致地执行此操作。问题是underlying call into the OS在所有情况下都不会强调焦点到特定窗口。从该页面:

  

系统限制哪些进程可以设置前景窗口。仅当满足下列条件之一时,进程才能设置前台窗口:

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

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

从用户的角度来看,这有很多意义。弹出窗口窃取你的焦点是令人难以置信的烦人,因为它可能导致错误的击键。但它确实意味着你想要做的事情不会起作用(并且不应该工作)所以你将不得不忍受它。