Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
298 views
in Technique[技术] by (71.8m points)

awt - Closing a Web Browser for a specific URL from the java program

I want to close an open web browser/browser tab for a specific URL from the java program. I am able to open the URL in internet explorer using the Desktop API from java.

Below is the code snippet to open the browser in IE

java.awt.Desktop desktop = java.awt.Desktop.getDesktop();
desktop.browse(new java.net.URI("http://www.xyzz.com"));

Now When I run the program again I want to make sure that there is no already instance where the above URL is opened in the browser. If it is so, close it and open it again in a new TAB or Browser window. This may look little weird requirement.

I know the basic approach should to get on to this issue is that, we need to identify the process and kill it and than again invoke the above code.

Any suggestion is welcome.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I doubt there is much you can do with Desktop since you don't get any reference to the launched process.

I have used this technique in the past (before Java 6 where Desktop did not exist) and since it works with Process, you should be able to kill it.

public static void openURL(String url) {
    StringBuilder sb = new StringBuilder();
    if (System.getProperty("os.name").indexOf("Windows")>-1) {
        String command = null;
        String urlLC = url.toLowerCase();
        if (urlLC.startsWith("https")) {
            command = WindowsCommandRetriever.getCommandForFileType("https");
        } else if (urlLC.startsWith("http")) {
            command = WindowsCommandRetriever.getCommandForFileType("http");
        }
        if (command == null) {
            command = WindowsCommandRetriever.commandForExtension(".html");
        }
        if (command.indexOf("%1") > -1) {
            sb.append(command.substring(0, command.indexOf("%1")));
            sb.append(url);
            sb.append(command.substring(command.indexOf("%1") + "%1".length()));
        } else {
            sb.append(command).append(' ');
            sb.append('"');
            sb.append(url);
            sb.append('"');
        }
    } else {
        sb.append("open ");
        sb.append(url);
    }
    try {
        final Process p = Runtime.getRuntime().exec(sb.toString());
        // Here you have the process. You can destroy it if you want
        // You need to figure out how you are going to handle this here.
    } catch (IOException e1) {
        e1.printStackTrace();
        System.err.println("Error while executing " + sb.toString());
    }
}

And the WindowsCommandRetriever:

/*
 * (c) Copyright 2010-2011 AgileBirds
 *
 * This file is part of OpenFlexo.
 *
 * OpenFlexo is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * OpenFlexo is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
 *
 */

public class WindowsCommandRetriever {
    /**
     * 
     * @param extension
     *            the file extension (with or without the preceding '.')
     * @return the command to execute for the specified <code>extension</code> or null if there are no associated command
     */
    public static String commandForExtension(String extension) {
        String regKey = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts" + extension;
        String fileType = WinRegistryAccess.getRegistryValue(regKey, "ProgID", WinRegistryAccess.REG_SZ_TOKEN);
        if (fileType == null) {
            StringBuilder sb = new StringBuilder("cmd /C assoc ");
            sb.append(extension.startsWith(".") ? extension : "." + extension);

            ConsoleReader reader;
            try {
                Process process = Runtime.getRuntime().exec(sb.toString());
                reader = new ConsoleReader(process.getInputStream());
                reader.start();
                process.waitFor();
                reader.join();
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            } catch (InterruptedException e) {
                e.printStackTrace();
                return null;
            }
            String result = reader.getResult();
            if (result.indexOf("=") > -1) {
                fileType = result.substring(result.indexOf("=") + 1).trim();
            }
        }
        if (fileType == null) {
            return null;
        }
        return getCommandForFileType(fileType);
    }

    public static String getCommandForFileType(String fileType) {
        String path = "HKEY_CLASSES_ROOT" + fileType + "\shell\open\command";
        return WinRegistryAccess.getRegistryValue(path, null, WinRegistryAccess.REG_SZ_TOKEN);
    }
}


/*
 * (c) Copyright 2010-2011 AgileBirds
 *
 * This file is part of OpenFlexo.
 *
 * OpenFlexo is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * OpenFlexo is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
 *
 */

import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;


public class WinRegistryAccess {

    private static final String REGQUERY_UTIL = "reg query ";

    public static final String REG_SZ_TOKEN = "REG_SZ";

    public static final String REG_BINARY = "REG_BINARY";

    public static final String REG_DWORD_TOKEN = "REG_DWORD";

    /**
     * Returns the value for an attribute of the registry in Windows. If you want to now the processor speed of the machine, you will pass
     * the following path: "HKLMHARDWAREDESCRIPTIONSystemCentralProcessor" and the following attribute name: ~MHz
     * 
     * @param path
     *            - the registry path to the desired value
     * @param attributeName
     *            - the name of the attribute or null for the default
     * @param attributeType
     *            - the type of attribute (DWORD/SZ/...) default is REG_SZ
     * @return - the value for the attribute located in the given path
     */
    public static String getRegistryValue(String path, String attributeName, String attributeType) {
        if (attributeType == null) {
            attributeType = REG_SZ_TOKEN;
        }
        try {
            if (!path.startsWith(""")) {
                path = """ + path + """;
            }
            StringBuilder sb = new StringBuilder();
            sb.append(REGQUERY_UTIL);
            sb.append(path);
            sb.append(' ');
            if (attributeName != null) {
                sb.append("/v ");
                sb.append(attributeName);
            } else {
                sb.append("/ve");
            }
            Process process = Runtime.getRuntime().exec(sb.toString());
            ConsoleReader reader = new ConsoleReader(process.getInputStream());
            reader.start();
            process.waitFor();
            reader.join();
            String result = reader.getResult();
            int p = result.indexOf(attributeType);
            if (p == -1) {
                return null;
            }
            return result.substring(p + attributeType.length()).trim();
        } catch (Exception e) {
            return null;
        }
    }

    public static class ConsoleReader extends Thread {
        private InputStream is;

        private StringWriter sw;

        ConsoleReader(InputStream is) {
            this.is = is;
            sw = new StringWriter();
        }

        @Override
        public void run() {
            try {
                int c;
                while ((c = is.read()) != -1) {
                    sw.write(c);
                }
            } catch (IOException e) {
                ;
            }
        }

        String getResult() {
            return sw.toString();
        }
    }

    public static String getJDKHome() {
        String key = ""HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit"";
        String currentVersionAtt = "CurrentVersion";
        String javaHomeAtt = "JavaHome";
        String res1 = getRegistryValue(key, currentVersionAtt, null);
        String res2 = getRegistryValue(key + "" + res1, javaHomeAtt, null);
        return res2;
    }

    public static void main(String s[]) {
        String key = ""HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit"";
        String currentVersionAtt = "CurrentVersion";
        String javaHomeAtt = "JavaHome";
        String res1 = getRegistryValue(key, currentVersionAtt, null);
        String res2 = getRegistryValue(key + "" + res1, javaHomeAtt, null);
        System.out.println("CurrentVersion '" + res1 + "'");
        System.out.println("JavaHome '" + res2 + "'");
    }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...