我有一个控制台应用程序,当输出重定向(外部)到文件或管道时,必须禁用或启用某些操作(myapp.exe> Foo.bar)
如何检查我的Delphi控制台应用程序是否重定向到文件或管道?
答案 0 :(得分: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.
答案 1 :(得分:9)
我在这里介绍的方法感觉很酷,但我无法找到更好的方法来检测标准输出是否已从屏幕控制台重定向。使用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.