2014-02-08 5 views
0

일부 응용 프로그램에서는 실행될 때 일부 데이터를 생성하고 저장합니다 (콘솔 응용 프로그램이 아닌 윈도우 응용 프로그램 임). 이제이 데이터를 분석하는 자체 응용 프로그램을 만드는 중입니다. 문제는 외부 소프트웨어가 동시에 실행되어야한다는 것입니다.활성 상태로 유지하면서 다른 응용 프로그램을 숨기기

사용자가 내 애플리케이션을 열면 자동으로 외부 애플리케이션을 시작하고 숨길 수 있기를 원합니다. 주제에 관해 많은 부분을 조사하고 내가 발견 한 몇 가지 제안을 시도했습니다. 먼저 시도 :

Process p = new Process(); 
p.StartInfo.FileName = @"c:\app.exe"; 
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.WorkingDirectory = @"c:\"; 
p.StartInfo.CreateNoWindow = true; 
p.Start(); 

이것은 외부 응용 프로그램을 시작하지만 숨기지 않습니다.

ProcessStartInfo psi = new ProcessStartInfo("cmd.exe", "/c \""c:\app.exe\""); 
psi.UseShellExecute = false; 
psi.CreateNoWindow = true; 
psi.WindowStyle = ProcessWindowStyle.Hidden; 
Process.Start(psi); 

다시 말하지만,이 응용 프로그램이 아닌 숨겨진 시작합니다 나는 다음 명령 PROMT 응용 프로그램을 숨길 수 있음을 읽어 보시기 바랍니다.

그런 다음 응용 프로그램을 시작한 다음 숨길 생각을했습니다. 다음을 찾았습니다 :

[DllImport("user32.dll")] 
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

[DllImport("user32.dll")] 
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

var Handle = FindWindow(null, "Application Caption"); 
ShowWindow(Handle, 0); 

이렇게하면 창이 숨겨집니다. 문제는 응용 프로그램이이 상태에서 비활성 상태이고 데이터를 생성하지 않는다는 것입니다.

편집 : 나는 (숨기기 대신 최소화하는) 받아 들일 수있는 해결책에 한발 다가갔습니다. 이 중 하나가 작동하지 않습니다

Process p = new Process(); 
p.StartInfo.FileName = @"c:\app.exe"; 
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.WorkingDirectory = @"c:\"; 
p.StartInfo.CreateNoWindow = true; 
p.Start(); 

while (true) 
{ 
    int style = GetWindowLong(psi.MainWindowHandle, -16); // -16 = GWL_STYLE 

    if ((style & 0x10000000) != 0) // 0x10000000 = WS_VISIBLE 
    { 
     ShowWindow(psi.MainWindowHandle, 0x06); 
     break; 
    } 

    Thread.Sleep(200);   
} 

,하지만 난 그게 올바른 방향으로 단계 믿습니다 : 외부 응용 프로그램이 느린 시작 조금이다, 나는 다음을 수행합니다.

활성 상태로 유지하면서 외부 응용 프로그램을 시작하고 숨길 수있는 방법이 있습니까?

안부

+1

, 않을 사람이없이 당신을 도울 수있을 것 같다 특정 애플리케이션을 아는 것. –

답변

0

나는 그것을 수행하여 작업을 만든 다음 윈도우가 숨겨져 응용 프로그램을 사용하지 않도록 설정하는 표준 동작이 없기 때문에

const int GWL_STYLE = -16; 
const long WS_VISIBLE = 0x10000000; 

while (true) 
{ 
    var handle = FindWindow(null, "Application Caption"); 

    if (handle == IntPtr.Zero) 
    { 
     Thread.Sleep(200); 
    } 
    else 
    { 
     int style = GetWindowLong(handle, GWL_STYLE); 

     if ((style & WS_VISIBLE) != 0) 
     { 
      ShowWindow(handle, 0x06); 
      break; 
     } 
    } 
} 
관련 문제