4

Java Java 응용 프로그램 내에서 Windows 가상 키보드가 이미 실행 중인지 확인하고 싶습니다.wmic.exe가 TempWmicBatchFile.bat을 작성하지 못하도록하십시오.

검색 한 결과 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 어떻게 든 라인 process where name='osk.exe' get caption하여 파일 TempWmicBatchFile.bat을 만드는 :

이 내가 뭘하는지입니다.

어떻게 이런 일이 일어나지 않도록 할 수 있습니까?

답변

2

다른 명령을 전달하기 위해 다른 스트림을 열지 않아도됩니다. 이것은 임시 박쥐 파일이 생성되는 이유입니다.

아래 코드를 사용하십시오. 임시 배치 파일을 만들지 않습니다.

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(); 
    } 
} 
+0

완벽! 정확히 내가 뭘 찾고 있었는지 :) –

관련 문제