【问题标题】:How to give focus to default program of shell-opened file, from Java?java - 如何从Java中关注shell打开文件的默认程序?
【发布时间】:2010-05-04 13:47:27
【问题描述】:

在 Java 中,我使用this stackoverflow question 中描述的方法使用默认文件处理程序(MS Excel,在本例中为 :-))打开一个 Excel 文件:

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

但是,Excel 程序没有获得焦点。有什么简单的方法吗?

编辑:有一个related stackoverflow question for C#,但是我没有找到任何类似的Java方法。

编辑 2:我做了一些简单的测试,发现只要没有运行 Excel 实例,Excel 就会启动并获得焦点。当 Excel 已打开且未最小化时,应用程序不会获得焦点。如果相反,Excel 窗口被最小化,上面的代码将触发窗口最大化并且 Excel 获得焦点(反之亦然:-))。

【问题讨论】:

    标签: java focus desktop launching-application


    【解决方案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() );
      }
    }
    

    【讨论】:

      【解决方案2】:

      从同样在 JVM 中运行的 scala 程序,我可以打开一个应用程序,默认情况下这是焦点。 (用 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 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程序是否有焦点,但它在交互环境中保持一种轮盘赌的形式,因为用户可能有一台快或慢的机器,或者更改为同时进行第三次申请,以此类推。也许在触发新应用之前的提示是你能做的最好的?

      【讨论】:

      • 感谢您的回答。我是唯一的用户(目前),所以我可以确认这不是点击次数过多的问题。事实上,我注意到有时 Excel 会成为焦点,但大多数时候不会。 BTW Excel 通常已经打开,这可能是问题的根源......
      猜你喜欢
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      相关资源
      最近更新 更多