Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Windows中使用Java将焦点设置为非Java应用程序_Java_Windows - Fatal编程技术网

在Windows中使用Java将焦点设置为非Java应用程序

在Windows中使用Java将焦点设置为非Java应用程序,java,windows,Java,Windows,我想编写一个在Windows中为非Java应用程序创建输入的应用程序。使用Robot类很容易生成输入,但我需要将焦点设置为另一个应用程序的文本框,然后在那里输入文本 别担心,我不是想写恶意的东西,我只是想用Java来“扩展”一个用Delphi编写的旧应用程序。检测一个特殊的应用程序并将其带到前台可能需要一个本机助手,但目前您可以发送ALT+TAB来激活“下一个”应用程序 这项工作: public void switchFocus() { try { Robot r = new Rob

我想编写一个在Windows中为非Java应用程序创建输入的应用程序。使用Robot类很容易生成输入,但我需要将焦点设置为另一个应用程序的文本框,然后在那里输入文本


别担心,我不是想写恶意的东西,我只是想用Java来“扩展”一个用Delphi编写的旧应用程序。

检测一个特殊的应用程序并将其带到前台可能需要一个本机助手,但目前您可以发送ALT+TAB来激活“下一个”应用程序

这项工作:

public void switchFocus() {
  try {
    Robot r = new Robot();
    r.keyPress(KeyEvent.VK_ALT);
    r.keyPress(KeyEvent.VK_TAB);
    r.keyRelease(KeyEvent.VK_ALT);
    r.keyRelease(KeyEvent.VK_TAB);
  } catch(AWTException e) {
    // handle
  }
}
您只需要实现一个方便的方法来将字符(从字符串)映射到关键事件值。。。(或找到一些现有的解决方案)

是一个命令行实用程序,允许您执行各种窗口操作,如激活/停用、列出、最小化/最大化等

或者,您可以编写VBScript来激活另一个应用程序。例如:

Set WshShell = WScript.CreateObject("WScript.Shell") 
WshShell.AppActivate("Firefox")
然后使用Java应用程序中的
Runtime.exec
执行脚本

这将帮助您激活另一个应用程序

Runtime runtime = Runtime.getRuntime();
            String[] args = { "osascript", "-e", "tell app \"Chrome\" to activate" };
            Process process = runtime.exec(args);

但是如果您想将注意力集中在其他应用程序中的文本框上并写入一些文本,那么将非常困难。

配置延迟,否则它将无法工作:

Robot r = new Robot();
r.keyPress(KeyEvent.VK_ALT);
r.keyPress(KeyEvent.VK_TAB);
r.delay(10); //set the delay
r.keyRelease(KeyEvent.VK_ALT);
r.keyRelease(KeyEvent.VK_TAB);

您需要为应用程序添加足够的延迟以完全初始化并获得焦点

下面是一个基本的工作示例。。。您需要模拟系统密钥以在程序之间切换是正确的。。。(Windows上的Alt+Tab,OS X上的Cmd+Tab)

import java.awt.*;
导入静态java.awt.event.KeyEvent.*;
导入java.io.IOException;
公共类机器人样本{
//https://stackoverflow.com/questions/4782231
私家静态整数[[]关键字[[]整整整整整整整整整整整[]码码码[{{VKUS,VKC,VKC,VK,VK,VK,VK,VKU[]码[]码码[{VKUS,VKU,VKU,VKUT,VKUA,VKUA,VK,VK C,C C C,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK,VK_8,VK_2,VK_2,VK_3,VK_1,VK_ENTER};
公共静态void main(字符串[]args)引发IOException{
试一试{
机器人=新机器人();
Runtime=Runtime.getRuntime();
runtime.exec(“C:\\ProgramFiles(x86)\\Google\\Chrome\\Application\\Chrome.exe”);
机器人按键(VK_ALT);
机器人按键(VK_标签);
机器人按键释放(VK_ALT);
机器人按键释放(VK_选项卡);
//冷静一下。。。
机器人延时(1000);
对于(int i=0;i
在Mac上,可以使用AppleScript来完成。AppleScript集成到系统中,因此它将始终保持功能。

您只需检测到您在mac上并且具有应用程序的名称

Runtime runtime = Runtime.getRuntime();
            String[] args = { "osascript", "-e", "tell app \"Chrome\" to activate" };
            Process process = runtime.exec(args);

另一种选择是,我的Java应用程序从未获得焦点,因此windows应用程序具有焦点,当您单击Java应用程序上的按钮时,焦点在原始窗口中从未丢失。我不知道这是否可能?对于那些通过谷歌在OSX上回答这个问题的人:我不得不说我喜欢CMDOW,但我注意到了两个问题。。非常慢。。在我过载的热节流系统上——现在订购一台新风扇——所以对于大多数用户来说,不知道它是否会引起注意,但是nircmd的工作速度要快得多。。所以,让人们知道nircmd也是一个选项——不支持通配符,但您可以指定子字符串是否匹配,或者从标题的开头还是结尾。我也不能用同一子字符串激活多个窗口,nircmd可以做到这一点。。因此,出于这两个原因,我选择了nircmd作为替代品。@dogbane您知道linux操作系统中类似的东西吗?