我在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窗口出现在任务栏中并且它一直闪烁(可能是因为它现在被设置为活动窗口)。
如何确保在显示时它出现在前台并且没有最小化到任务栏?
感谢。
答案 0 :(得分:1)
您不能在Windows上一致地执行此操作。问题是underlying call into the OS在所有情况下都不会强调焦点到特定窗口。从该页面:
系统限制哪些进程可以设置前景窗口。仅当满足下列条件之一时,进程才能设置前台窗口:
- 该过程是前台过程。
- 该过程由前台进程启动。
- 该过程收到了最后一个输入事件。
- 没有前台进程。
- 正在调试前台进程。
- 前景未锁定(请参阅
LockSetForegroundWindow
)。- 前台锁定超时已过期(请参阅
SPI_GETFOREGROUNDLOCKTIMEOUT
中的SystemParametersInfo
)。- 没有菜单处于活动状态。
当用户使用另一个窗口时,应用程序无法强制窗口到达前台。相反,Windows会闪烁窗口的任务栏按钮以通知用户。
从用户的角度来看,这有很多意义。弹出窗口窃取你的焦点是令人难以置信的烦人,因为它可能导致错误的击键。但它确实意味着你想要做的事情不会起作用(并且不应该工作)所以你将不得不忍受它。