2012-09-03 23 views
0

我知道我可以調用AttachConsoleGetStdHandle kernel32函數來訪問不同控制檯進程的控制檯屏幕緩衝區,但是如果此進程將其輸入/輸出/錯誤重定向到文件或設備,我如何獲得這些控制檯的句柄重定向的位置呢?要清楚地說明:我沒有對第三方提供的應用程序的控制權,所以我的IPC機率不大。在Windows中,如何獲取不同控制檯進程的標準設備句柄?

回答

2

GetStdHandle將兌現任何重定向並返回redirected handle;

的處理的標準的把手可以由一個呼叫被重定向到 SetStdHandle,在這種情況下GetStdHandle返回重定向 手柄

該鏈接還介紹瞭如何請求原件。

+0

我意識到我在內部附加的過程會覆蓋命令行中指定的標準輸出。 –

+0

但是,'GetStdHandle'只爲進程返回重定向,其中函數正在調用。它不能爲外部進程返回有效值(問題中提到的IPC) – Maximus

0

您可以使用CreateRemoteThread將代碼插入其他進程並從那裏調用GetStdHandle。然後,您需要使用DuplicateHandle在您自己的過程中製作句柄的副本。

請記住,您對該句柄所做的任何操作都會影響目標進程中的句柄,這可能會導致意外問題。例如,如果兩個進程都嘗試從標準輸入流中讀取數據,則無法預測哪個進程會看到輸入的哪一部分,如果兩個進程都寫入標準輸出流,則輸出可能會隨機重疊方式或一組輸出可能會覆蓋另一個。

+1

需要注意的是'DuplicateHandle'不能爲另一個進程複製未重定向的控制檯句柄:http://msdn.microsoft.com/en-us/library/ windows/desktop/ms682075(v = vs.85).aspx –

+0

@ ft1:謝謝。我不知道。什麼是檢查這個最好的方法? GetFileType? –

+0

那麼,在關於WriteConsole的文檔中,他們建議檢查GetConsoleMode是否成功,但我還沒有測試過它,所以不要相信我比MSDN多:-) –