2010-04-01 131 views
2

我正在嘗試通過使用來自c#的命令參數與供應商應用程序進行集成。它意味着自動化一個流程,我們需要做的是不需要任何人與應用程序進行交互。如果在運行該過程時沒有錯誤,則工作正常。控制檯應用程序顯示錯誤消息框

但是,如果出現任何錯誤,供應商應用程序將顯示帶有錯誤代碼和錯誤消息的消息框,並等待某人單擊確定按鈕。點擊確定按鈕後,它將退出應用程序,返回錯誤代碼作爲退出代碼。

由於我的應用程序將是一個服務器上的Windows服務,需要有人點擊一個好的按鈕將是一個問題。只是想知道最好的解決方案是什麼來解決這個問題。

我的代碼調用供應商的應用程序是...

ProcessStartInfo startInfo = new ProcessStartInfo(); 
startInfo.FileName = "someapp.exe" 
startInfo.Arguments = "somefile.txt"; 

Process jobProcess = Process.Start(startInfo); 
jobProcess.WaitForExit(); 

int exitCode = jobProcess.ExitCode; 
+2

在控制檯應用程序中使用消息框顯示錯誤是一種錯誤的設計。這太糟糕了。 – 2010-04-01 01:26:03

+0

與其他供應商應用程序相比,這部分是相當不錯的。 :( – holz 2010-04-01 01:34:28

回答

1

非常快,骯髒和下面髒代碼。 真的想要做的是有一個循環,每秒鐘查找一個特定的對話框,或者如果它看到它,則發送回車。這應該讓你在山上但就目前而言(未經測試,順便說一句):

ProcessStartInfo startInfo = new ProcessStartInfo(); 
startInfo.FileName = "someapp.exe" 
startInfo.Arguments = "somefile.txt"; 

Process jobProcess = Process.Start(startInfo); 

//wait for the process to potentially finish...if it generally takes a minute to end, wait a minute and a half, etc 
System.Threading.Thread.Sleep(60 * 1000); 

Process[] processes = Process.GetProcessesByName("someapp"); 

if (processes.Length == 0) 
{ 
    break; //app has finished running 
} 
else 
{ 
    Process p = processes[0]; 
    IntPtr pFoundWindow = p.MainWindowHandle; 
    SetFocus(new HandleRef(null, pFoundWindow)); 
    SetForegroundWindow((int)pFoundWindow); 
    SendKeys.SendWait("{ENTER}");   
} 

int exitCode = jobProcess.ExitCode; 

選項B是修改自己的控制檯應用程序 - 找到MessageBoxA通話,並與MOV EAX代替它,1使該對話框從來沒有出現,它就像用戶點擊「確定」。

+0

我曾嘗試過這樣的事情,但當我的應用程序作爲服務運行時,它不起作用。 該進程的MainWindowHandle爲零。 – holz 2010-04-07 04:10:00

+0

http://social.msdn.microsoft.com/Forums/en -US/netfxbcl/thread/d4dd2efd-353e-4c9c-ab08-b6d264aa1c9d 給那個旋轉。 – szevvy 2010-04-12 04:23:09