代码之家  ›  专栏  ›  技术社区  ›  Blakhar

阻止wmic.exe写入TempWmicBatchFile.bat

  •  4
  • Blakhar  · 技术社区  · 12 年前

    我想在我的Java应用程序中检查windows虚拟键盘是否已经在运行。

    我搜索了一下,发现了,我可以使用 wmic.exe 以搜索进程。

    这就是我正在做的:

    Process proc = Runtime.getRuntime().exec("wmic.exe");
    BufferedReader input = new BufferedReader(new InputStreamReader(proc
        .getInputStream()));
    OutputStreamWriter oStream = new OutputStreamWriter(proc
        .getOutputStream());
    oStream .write("process where name='osk.exe' get caption");
    oStream .flush();
    oStream .close();
    input.readLine();
    while ((in = input.readLine()) != null) {
        if (in.contains("osk.exe")) {
            input.close();
            proc.destroy();
            return;
        }
    }
    input.close();
    proc.destroy();
    

    这是有效的,但是 wmic 正在以某种方式创建文件 TempWmicBatchFile.bat 与线路 process where name='osk.exe' get caption

    我该如何防止这种情况发生?

    1 回复  |  直到 12 年前
        1
  •  2
  •   Manish Singh    12 年前

    您可以避免打开其他流来传递另一个命令。这就是创建临时bat文件的原因。

    使用以下代码。它不会创建临时批处理文件

    public class WmicTest {
    
        public static void main(String[] args) throws IOException {
    
            Process proc = Runtime.getRuntime().exec("wmic.exe process where name='osk.exe' get caption");
            BufferedReader input = new BufferedReader(new InputStreamReader(proc
                    .getInputStream()));
    //        OutputStreamWriter oStream = new OutputStreamWriter(proc
    //                .getOutputStream());
    //        oStream.write("process where name='osk.exe' get caption");
    //        oStream.flush();
     //       oStream.close();
            input.readLine();
            String in;
            while ((in = input.readLine()) != null) {
                if (in.contains("osk.exe")) {
                    System.out.println("Found");
                    input.close();
                    proc.destroy();
                    return;
                }
            }
            input.close();
            proc.destroy();
        }
    }