检查Java是否关注某个应用程序

时间:2019-09-15 13:06:57

标签: java linux xdotool

我想知道Linux是否关注某个应用程序。说它是谷歌浏览器。为此,我编写了一个bash在线衬垫,可以正确执行此操作。

SELECT SUM(trans_value) total, bectrn_id, becat_id FROM brvo_bemrc_transactions WHERE year = p_year AND trn_type = p_trntype AND doc_type = p_doctype AND company = p_company AND bedfn_id = p_bedfn_id AND bectrn_id = v_bectrn_id AND becat_id = v_becat_id AND CASE WHEN (extract(month FROM SYSDATE) IN (1, 2, 3)) THEN to_date(last_update_date) >= to_date(concat('01-OCT-', p_year - 1)) AND to_date(last_update_date) <= to_date(concat('31-DEC-', p_year - 1)) WHEN (extract(month FROM SYSDATE) IN (4, 5, 6)) THEN to_date(last_update_date) >= to_date(concat('01-JAN-', p_year - 1)) AND to_date(last_update_date) <= to_date(concat('31-MAR-', p_year - 1)) WHEN (extract(month FROM SYSDATE) IN (7, 8, 9)) THEN to_date(last_update_date) >= to_date(concat('01-APR-', p_year - 1)) AND to_date(last_update_date) <= to_date(concat('30-JUN-', p_year - 1)) WHEN (extract(month FROM SYSDATE) IN (10, 11, 12)) THEN to_date(last_update_date) >= to_date(concat('01-JUL-', p_year - 1)) AND to_date(last_update_date) <= to_date(concat('30-SEP-', p_year - 1)) END GROUP BY bectrn_id, becat_id;

在终端中运行此命令时,它将打印终端本身的ID。为避免这种情况,请运行以下命令并在三秒钟的时间范围内选择Chrome。

xdotool search --name --class 'google-chrome' | grep $(xdotool getactivewindow)

问题是,当我从Java运行上述单行代码时,它似乎总是不打印任何内容。这是我的代码:

sleep 3; xdotool search --name --class 'google-chrome' | grep $(xdotool getactivewindow)

我愿意采用不同的解决方案来解决此问题。

3 个答案:

答案 0 :(得分:1)

如果您正在使用管道重定向,那么您要么必须调用Shell,要么自己将输出从一个程序重定向到另一个程序。

但是,恕我直言,您根本不需要grep,只需:

  1. 枚举某些类的窗口。
  2. 获取活动窗口ID,并检查活动窗口列表中是否包含该窗口。

示例(q&d,省略了资源/错误处理):

private static List<String> exec(String... args) throws IOException {
    List<String> result = new ArrayList<>();
    String line;

    BufferedReader reader = new BufferedReader(
            new InputStreamReader(
                    new ProcessBuilder()
                            .command(args)
                            .start()
                            .getInputStream()));

    while ((line = reader.readLine()) != null) {
        result.add(line);
    }

    return result;
}

public static void main(String[] args) {
    try {
        Thread.sleep(3000);

        String windowId = exec("xdotool", "getactivewindow").get(0);
        System.out.println(windowId);

        List<String> windowList = exec("xdotool", "search", "--name", "--class", "google-chrome");
        System.out.println(windowList.contains(windowId));
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }

答案 1 :(得分:1)

正如barti_ddu所说,由于命令中的管道,此方法不起作用。您可以通过使用作为参数传递的命令创建一个sh进程来解决此问题:

    String cmd = "xdotool search --name --class 'google-chrome' | grep $(xdotool getactivewindow)";
    Process p = new ProcessBuilder("sh", "-c", cmd).start();
    String result = getCommandResult(p.getInputStream());

答案 2 :(得分:0)

为什么要将该命令硬编码到类中?而是将命令放入外壳脚本中,然后调用它。然后,您可以灵活地更改命令而无需重新编译。

def course():
    dept = input("Enter Course Dept: ")
    number = input("Enter Course Code: ")
    row = data[(data['Department']==dept.upper()) & (data['Course_number']==number)]
    op=row.Pre_Requisites.values
    str_join = "".join(op)
    display(HTML(row.to_html()))
    if 'None' in str_join:
        print("No pre-req for this course!")
    else:
        r = replace_all(str_join, ["and", "or", "(", ")"], ",")
        string= [part.split() for part in r.split(",") if part.strip()]
    #print(string)

        for item in string:
            if item[0] == 'C':
                continue
            if item[0] == 'ENVE':
                print(item[0],item[1])
                continue
            if item[0] == 'CE':
                continue
            display(HTML(data[(data["Department"] == item[0]) & (data["Course_number"] == item[1])].to_html()))

...根据您的应用程序,最好将shell脚本作为参数传递。

Process proc = Runtime.getRuntime().exec("./opt/scripts/myscript.sh");

编辑:

如果您的目标是弄清楚当前聚焦于哪个窗口,则可以尝试使用JNA(Java Native Access)库来执行此操作,而不是尝试通过命令行执行某些操作。

Find out what application (window) is in focus in Java

Java Native Access (Github)