1

Always On Top に設定された単一の JFrame で構成される Swing アプリケーションがあります。

Windows で実行する場合、次のコードを使用して、ネイティブの既定の電子メール クライアントとブラウザーをそれぞれ開きます。

Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + Utils.formatMailtoUrl(to, subject, body));
Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url);

JFrame は Always On Top に設定されていますが、一般的なデフォルトのブラウザーまたは電子メール クライアント (お客様の場合は IE および Outlook) は Always On Top として開かないため、前者は後者を妨げます。

現在の「解決策」は、ネイティブ ウィンドウを開くと同時に JFrame を最小化することです。しかし、これは 508 準拠の問題であることが判明し、次のことを求められています。

  1. JFrame を最小化しません。
  2. ブラウザまたは電子メール クライアントを閉じた後、フォーカスを JFrame に戻す

私が念頭に置いている戦略は、JFrame の Always On Top 状態を「オフ」にし、何らかのコールバックまたはイベント リスナーを用意して、電子メールまたはブラウザ ウィンドウが閉じられたことを JFrame に通知し、JFrame を元の状態に戻すことです。 Always On Top 状態にしてフォーカスを設定します。

これは Java アプリであるため、ネイティブの相互運用性について話しているため、これは不可能に近いのではないかと心配しています。私の戦略は実行可能ですか、実行可能なより良い戦略はありますか、そして最も重要なのは、それをどのように実行できるか?!

前もって感謝します!

4

2 に答える 2

1

これを行うネイティブの方法があるかどうかはわかりませんが、tasklist.exeまたはvbスクリプトを実行して結果をキャプチャし、そこからOutlookまたはIExploreが実行されているかどうかを判断できます。これには、イベントを待つのではなく、妥当な間隔でチェックを実行する必要があります。

Process p = Runtime.getRuntime().exec("tasklist.exe /FO CSV /FI eq outlook.exe");
BufferedReader input = new BufferedReader (new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
    look for a line containing outlook.exe
}
input.close();

これまたはそれでタスクリストをフィルタリングできるとは思わないので、outlook.exeとiexplorer.exeを別々にチェックする必要があります。

これを一般化して、元の呼び出しによって開かれたものを探すことができると確信しています。

編集:これをすべて書いたので、元の呼び出しがプロセスを返し、それを使用できることがわかりました。そこで、何か試してみて、新しいスレッドを開始し、そのスレッドでデフォルトの電子メールプログラムまたはブラウザを開き、「常に最上位」の状態を削除して、返されたプロセスでwaitforを呼び出します。その呼び出しの後、「常に上」の状態を設定します。そのスレッドは、GUIまたは他のプログラム機能をロックせずにプロセスが終了するのを待ちます。

于 2010-10-30T17:37:20.307 に答える
0

私は次のことである程度成功しています:

  1. ブラウザーを開くためのアクション (たとえば) が起動されたら、JFrame Always On Top 設定をオフにします。
  2. JFrame Always On Top 設定を有効にするオン ウィンドウ フォーカス アクションを設定します。
  3. ユーザーがブラウザー以外のウィンドウに移動しない場合、ブラウザーを閉じると、JFrame は自動的にフォーカスを取り戻し、常に最前面に設定されます。

このアプローチには 2 つの欠点があります。1 つ目は、ブラウザ ウィンドウを閉じる前にユーザーが手動で JFrame ウィンドウに戻ると、JFrame がフォーカスを取り戻し、Always On Top モードでスタックする可能性があることです。でもこれなら納得かも。2 つ目の問題は、JAWS バージョン 9 のスクリーン リーダーが狂ってしまい、JFrame がフォーカスを取り戻すと、最後にフォーカスされたコンポーネントを少なくとも 3 回読み直すことです。

于 2010-11-08T17:28:44.607 に答える