I have a console app that must disable or enable some operations when output is redirected (externally) to a file or pipe (myapp.exe > Foo.bar)
How I can check if my Delphi console app is redirected to a file or pipe?
I have a console app that must disable or enable some operations when output is redirected (externally) to a file or pipe (myapp.exe > Foo.bar)
How I can check if my Delphi console app is redirected to a file or pipe?
you can use the GetStdHandle
and GetFileType
functions.
first you retrieve the console output handle using the GetStdHandle function and then you can check the type of the handle with the GetFileType
function.
{$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.
The approach I present here feels hacky but I can't find a better way to detect whether or not the standard output has been redirected away from a screen console. The approach using GetFileType
cannot detect all forms of redirection since some redirections are to devices of type FILE_TYPE_CHAR
.
Call GetConsoleMode()
passing the standard output handle. If GetConsoleMode()
fails then your console has been redirected.
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.