2014-02-08 71 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(); 

這會啓動外部應用程序,但不會隱藏它。 我再讀取該命令PROMT可以隱藏應用程序:

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

這再次啓動該應用程序非隱藏。

然後我想到啓動應用程序,然後隱藏它。我發現以下內容:

[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; 
     } 
    } 
} 
相關問題