【问题标题】:Perl Tk Active WindowPerl Tk 活动窗口
【发布时间】:2012-08-18 04:52:09
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 不是纯粹的 Perl/Tk 问题;这是一个 Tk 问题。

标签: perl tk


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 这在wiki page for the focus command 上进行了一些讨论,但没有解决方法。
  • 我已经开始工作了 :) 是的,您需要调用 OS API,例如,API 由 user32.dll 导出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
相关资源
最近更新 更多