1

Windows 7 で、指定した間隔でバッチ ファイルを実行するスケジュール タスクを作成しました。

このバッチ ファイルは、Perl スクリプトを呼び出します。Perl スクリプト内で、結果に基づいて、Perl Tk を使用してアラートを出すポップアップ メッセージを表示します。

ここで、インターネットの閲覧など、自分のマシンで他のタスクを実行している間、たとえばブラウザ ウィンドウがアクティブなウィンドウになります。その間に、スケジュールされたタスクが実行され、ポップアップ ウィンドウは表示されず、代わりに最小化されてタスク バーに表示されます。

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 では一貫してこれを行うことはできません。問題は、OS への基になる呼び出しが、すべての場合にフォーカスを特定のウィンドウに強制しないことです。そのページから:

システムは、フォアグラウンド ウィンドウを設定できるプロセスを制限します。プロセスは、次の条件のいずれかに該当する場合にのみ、フォアグラウンド ウィンドウを設定できます。

  • プロセスはフォアグラウンド プロセスです。
  • プロセスはフォアグラウンド プロセスによって開始されました。
  • プロセスは最後の入力イベントを受け取りました。
  • フォアグラウンド プロセスはありません。
  • フォアグラウンド プロセスはデバッグ中です。
  • 前景はロックされていません ( を参照LockSetForegroundWindow)。
  • フォアグラウンド ロック タイムアウトの期限が切れました ( を参照SPI_GETFOREGROUNDLOCKTIMEOUT) SystemParametersInfo
  • アクティブなメニューはありません。

ユーザーが別のウィンドウで作業している間、アプリケーションはウィンドウを強制的に前面に出すことはできません。代わりに、Windows はウィンドウのタスクバー ボタンを点滅させてユーザーに通知します。

ユーザーの観点からは、これは非常に理にかなっています。ポップアップ ウィンドウにフォーカスが奪われるのは、キーストロークの方向を間違える可能性があるため、非常に煩わしいものです。しかし、それはあなたがしようとしていたことがうまくいかない (そしてうまくいかない) ことを意味するので、我慢しなければなりません。

于 2012-08-20T06:46:11.193 に答える