Как сфокусироваться на программе по умолчанию для открытого файла оболочки из Java? - PullRequest
4 голосов
/ 04 мая 2010

Изнутри Java я открываю файл Excel с помощью обработчика файлов по умолчанию (в данном случае MS Excel :-)), используя метод, описанный в в этом вопросе stackoverflow :

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

Однако программа Excel не фокусируется. Есть ли простой способ сделать это?

Редактировать: Есть вопрос, связанный с stackoverflow для C # , но я не нашел подобного метода Java.

Редактировать 2: Я провел несколько простых тестов и обнаружил, что Excel запускается и получает фокус, когда ни один экземпляр Excel не работает. Когда Excel уже открыт и НЕ свернут, приложение не получает фокус. Если вместо этого Windows Excel была свернута, приведенный выше код вызовет максимизацию окна, а Excel получит фокус (или наоборот :-)).

Ответы [ 2 ]

1 голос
/ 10 мая 2010

Если вас интересует только 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() );
  }
}
0 голосов
/ 07 мая 2010

Из scala-программы, которая также работает в JVM, я могу открыть приложение, и оно по умолчанию находится в центре внимания. (Протестировано с xUbuntu, который является разновидностью Linux).

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

Я не могу сказать, специфично ли это для Linux, или, может быть, для чего-то еще - однако запуск Inkscape в моем примере, превосходный в вашем, может занять несколько секунд, пока пользователь нетерпеливо нажимает на javaprogram снова, тем самым утверждая, что курсор назад. Вы проверяли это?

Затем вы можете перейти к последнему приложению, по крайней мере, в Linux и Windows, используя ALT-Tab, также известный как 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-программа, но сохраняет ли она форму рулетки в интерактивной среде, потому что у пользователя может быть быстрый или медленный компьютер, или переход на тем временем третье приложение и так далее. Может быть, подсказка перед запуском нового приложения - лучшее, что вы можете сделать?

...