我有一个控制台应用程序,当输出redirect到一个文件或pipe道(myapp.exe> Foo.bar)时,必须禁用或启用一些操作。
如何检查我的Delphi控制台应用程序是否被redirect到文件或pipe道?
您可以使用GetStdHandle
和GetFileType
函数。
首先使用GetStdHandle函数检索控制台输出句柄,然后使用GetFileType
函数检查句柄的类型。
{$APPTYPE CONSOLE} {$R *.res} uses Windows, SysUtils; function ConsoleRedirected: Boolean; var FileType : DWORD; begin FileType:= GetFileType(GetStdHandle(STD_OUTPUT_HANDLE)); Result := (FileType=FILE_TYPE_PIPE) or (FileType=FILE_TYPE_DISK); end; begin try if ConsoleRedirected then Writeln('Hello From File') else Writeln('Hello Console'); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.
我在这里提出的方法感觉很不舒服,但我找不到一个更好的方式来检测标准输出是否已被重定向远离屏幕控制台。 使用GetFileType
的方法无法检测到所有形式的重定向,因为某些重定向是对FILE_TYPE_CHAR
类型的设备。
调用GetConsoleMode()
传递标准输出句柄。 如果GetConsoleMode()
失败,那么您的控制台已被重定向。
program RedirectionDetection; {$APPTYPE CONSOLE} uses Windows; function ConsoleRedirected: Boolean; var Mode: DWORD; begin Result := not GetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), Mode); end; begin if ConsoleRedirected then begin Writeln('I have been redirected'); end else begin Writeln('I am a console'); Readln; end; end.