RRU*_*RUZ 12
你可以使用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.
Run Code Online (Sandbox Code Playgroud)
我在这里提出的方法感觉很难,但是我找不到更好的方法来检测标准输出是否已经从屏幕控制台重定向.使用的方法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.
Run Code Online (Sandbox Code Playgroud)