2008-12-10 40 views
16

是否可以在Windows窗體或用戶控件中的C#2.0中嵌入DOS控制檯?在Windows窗體中嵌入DOS控制檯

我們有一個傳統的DOS產品,我的Windows應用程序必須與其進行交互,並且已請求舊產品的實例應在Windows應用程序中運行。

目前,我使用user32.dll來定位DOS產品運行的窗口,最小化然後最大化窗口並在窗口中輸入字符。這不是一個很好的解決方案,因爲這意味着我的應用程序必須將應用程序設置中的窗口名稱存儲起來,並且要求用戶在使用交互功能之前返回DOS應用程序的正確頁面。

編輯:一些更多的信息

繼承應用程序必須對用戶可見,但不是在一個單獨的窗口。

我試過TimothyP的答案,它工作得很好,但它可以實現相同的功能,但與DOS窗口視覺嵌入在窗體或用戶控件,而不是彈出它自己的窗口?最好採用ShowDialog()方式,這樣用戶就不會與應用程序進行交互,只要它們處於「傳統模式」即可。

回答

22

可以使用Process類重定向控制檯/ dos應用程序的標準輸入/輸出。它可能看起來像這樣:

var processStartInfo = new ProcessStartInfo("someoldapp.exe", "-p someparameters"); 

processStartInfo.UseShellExecute = false; 
processStartInfo.ErrorDialog = false; 

processStartInfo.RedirectStandardError = true; 
processStartInfo.RedirectStandardInput = true; 
processStartInfo.RedirectStandardOutput = true; 
processStartInfo.CreateNoWindow = true; 

Process process = new Process(); 
process.StartInfo = processStartInfo; 
bool processStarted = process.Start(); 

StreamWriter inputWriter = process.StandardInput; 
StreamReader outputReader = process.StandardOutput; 
StreamReader errorReader = process.StandardError; 
process.WaitForExit(); 

您現在可以使用流與應用程序進行交互。 通過設置processStartInfo.CreateNoWindow爲true,原始應用程序將被隱藏。

我希望這會有所幫助。

+0

我如何使用「outputReader」與運行,直到用戶存在,它不斷outputing的應用程序?像nodejs http服務器,每次發出請求時都有新的行輸出? – Ace 2016-02-26 13:51:33

1

您可以使用CreateProcess函數和STARTUPINFO參數的hStdInput,Output和Error成員,這將允許您截取應用程序的標準輸入和輸出。

4

關於如何在Windows應用程序內顯示DOS應用程序的問題。

有幾個解決方案。

  • 第一種是根本就沒有顯示DOS應用程序(與CreateNoWindow) 並通過讀取和寫入流「模擬」在您的Windows應用程序的DOS應用程序的UI。

  • 另一種解決方案是使用Win32API,獲取控制檯/ DOS應用程序窗口的Windows句柄(Whnd)並將其父窗口設置爲您的窗體。我目前不在家 ,而且自從我做完這件事後已經過了很多年了,我不記得它是如何完成的。如果我沒有記錯的話,你就需要使用下面的Win32 API調用:

如果我有一段時間後今天離開,我會看看我能否找到更好的樣本。

+0

謝謝蒂莫西,我已經使用了FindWindow和GetWindow API調用,我今天會研究SetParent。 再次感謝您的幫助!希望有一天我能夠得到回報。 – 2008-12-12 09:19:52

相關問題