4

Java内から、このstackoverflow questionで説明されている方法を使用して、デフォルトのファイルハンドラー(この場合はMS Excel、:-))でExcelファイルを開いています:

Desktop dt = Desktop.getDesktop();
dt.open(new File(filename));

ただし、Excel プログラムにはフォーカスがありません。そうする簡単な方法はありますか?

編集: C# には関連する stackoverflow の質問がありますが、同様の Java メソッドは見つかりませんでした。

編集 2: 簡単なテストをいくつか行ったところ、Excel のインスタンスが実行されていないときはいつでも Excel が起動してフォーカスを取得することがわかりました。Excel が最小化されていない状態で既に開いている場合、アプリケーションはフォーカスを取得しません。代わりに Excel ウィンドウが最小化されている場合、上記のコードはウィンドウの最大化をトリガーし、Excel がフォーカスを取得します (またはその逆 :-) )。

4

2 に答える 2

1

Windows のみに関心がある場合 (質問で暗示されている)、Excel の起動方法を変更できます。「cmd start...」を使用します。

このコードを使用して、しばらくの間 Windows アプリケーションを起動してきました。毎回動作します。アプリケーションを見つけるには、Windows のファイルの関連付けに依存します。起動されたアプリケーションは、デスクトップ上でフォーカスされたウィンドウになります。

あなたの場合、Excel は .xls、.csv、およびその他の一般的な拡張子に関連付ける必要があります。そうである場合、Windows は Excel を起動し、ファイルを渡します。

使用法:

MyUtilClass.startApplication( "c:\\mydir\\myfile.csv", "my window title" );

fileは、Excel の入力ファイルへのフル パスでtitleあり、ウィンドウ タイトルです (アプリケーションが取得する場合と取得しない場合があります。Excel はウィンドウ タイトルを変更します)。

public static void startApplication( String file, String title )
{
  try
  {
     Runtime.getRuntime().exec( new String[] { "cmd", "/c", "start", title, file } );
  }
  catch( Exception e )
  {
     System.out.println( e.getMessage() );
  }
}
于 2010-05-09T20:41:50.767 に答える
0

JVMでも実行されるscalaプログラムから、アプリケーションを開くことができ、デフォルトでフォーカスされます。(Linux の一種である xUbuntu でテスト済み)。

import java.awt.Desktop                
val dt = Desktop.getDesktop ();        
dt.open (new java.io.File ("euler166.svg"));

これがLinuxに固有のものなのか、それとも何か他のものなのかはわかりませんが、私の例でInkscapeを起動すると、ユーザーがイライラしてJavaプログラムを再度クリックすると、カーソルが元に戻るまで数秒かかる場合があります. それを確認しましたか?

次に、少なくとも Linux と Windows では、ALT-Tab aka Meta-Tab を使用して、最後のアプリケーションに変更できます (ここでも scala コードで示されていますが、これは javacode に簡単に変換できると確信しています)。

import java.awt.Robot
import java.awt.event._ 

val rob = new Robot ()
rob.keyPress (KeyEvent.VK_META)
rob.keyPress (KeyEvent.VK_TAB)
rob.keyRelease (KeyEvent.VK_TAB)
rob.keyRelease (KeyEvent.VK_META)

残念ながら、ユーザーとしても知られている未知のソース オフ モア トラブルは何もしない可能性があるため、切り替えは間違った行為になります。おそらく、Javaプログラムにフォーカスがあるかどうかを一定時間チェックするスレッドを使用しますが、ユーザーが高速または低速のマシンを使用している可能性があるため、対話環境でルーレットの形式を維持します。その間、3 番目のアプリケーションなど。新しいアプリを起動する前のヒントは、あなたにできる最善のことでしょうか?

于 2010-05-07T18:22:11.153 に答える