我知道我可以調用AttachConsole
和GetStdHandle
kernel32函數來訪問不同控制檯進程的控制檯屏幕緩衝區,但是如果此進程將其輸入/輸出/錯誤重定向到文件或設備,我如何獲得這些控制檯的句柄重定向的位置呢?要清楚地說明:我沒有對第三方提供的應用程序的控制權,所以我的IPC機率不大。在Windows中,如何獲取不同控制檯進程的標準設備句柄?
回答
GetStdHandle
將兌現任何重定向並返回redirected handle;
的處理的標準的把手可以由一個呼叫被重定向到
SetStdHandle
,在這種情況下GetStdHandle
返回重定向 手柄。
該鏈接還介紹瞭如何請求原件。
您可以使用CreateRemoteThread
將代碼插入其他進程並從那裏調用GetStdHandle
。然後,您需要使用DuplicateHandle
在您自己的過程中製作句柄的副本。
請記住,您對該句柄所做的任何操作都會影響目標進程中的句柄,這可能會導致意外問題。例如,如果兩個進程都嘗試從標準輸入流中讀取數據,則無法預測哪個進程會看到輸入的哪一部分,如果兩個進程都寫入標準輸出流,則輸出可能會隨機重疊方式或一組輸出可能會覆蓋另一個。
需要注意的是'DuplicateHandle'不能爲另一個進程複製未重定向的控制檯句柄:http://msdn.microsoft.com/en-us/library/ windows/desktop/ms682075(v = vs.85).aspx –
@ ft1:謝謝。我不知道。什麼是檢查這個最好的方法? GetFileType? –
那麼,在關於WriteConsole的文檔中,他們建議檢查GetConsoleMode是否成功,但我還沒有測試過它,所以不要相信我比MSDN多:-) –
- 1. 獲取控制檯句柄
- 2. Windows - 在子進程中繼承控制檯文件句柄
- 3. 在C#中獲取USB設備句柄
- 4. 不同的進程句柄
- 5. 如何獲取Windows中當前進程的所有子進程的句柄?
- 6. 從控制手柄獲取進程
- 7. 如何知道進程句柄是否準備就緒
- 8. 獲取設備句柄時出錯
- 9. 獲取進程主線程的句柄
- 10. 獲取Windows句柄的WNDPROC
- 11. 如何在Visual C++中獲取進程的句柄?
- 12. 在Windows DLL中,如何獲取當前進程已打開的文件句柄?
- 13. Win32API - 如何從進程句柄獲取進程的文件名?
- 14. 設備句柄
- 15. msys2,使用標準的Windows控制檯
- 16. 從驅動器號獲取Windows設備句柄
- 17. 如何在Windows-10的C控制檯程序中獲取鼠標輸入?
- 18. 如何獲取Windows控制檯高度?
- 19. 獲取藍牙低功耗設備的設備句柄
- 20. 獲取進程表格的句柄c#
- 21. 如何從進程ID獲取進程句柄?
- 22. 如何獲取鍵盤設備的句柄?
- 23. 如何在Windows應用程序中將輸出句柄設置爲打開的控制檯
- 24. 通過名稱獲取控制句柄
- 25. 繼承Windows中父進程的句柄
- 26. 獲取句柄並寫入啓動我們的過程的控制檯
- 27. 獲取正在運行的進程給定的進程句柄
- 28. 如何獲得控制檯的進程id在C#控制檯應用程序
- 29. 如何在「不主要」進程中從控制檯讀取
- 30. 獲取獨佔進程句柄
我意識到我在內部附加的過程會覆蓋命令行中指定的標準輸出。 –
但是,'GetStdHandle'只爲進程返回重定向,其中函數正在調用。它不能爲外部進程返回有效值(問題中提到的IPC) – Maximus