如何知道控制台的背景和文字颜色?

时间:2019-06-19 16:04:57

标签: colors console freepascal

* NOT A DUPLICATE *,因为它仅指C ++和Windows。

(当前用于Windows,但也首选用于Linux的解决方案。)

我有一个使用TextColor和/或TextBackground突出显示某些文本的应用程序。因为用户可以更改控制台的默认设置,所以我希望能够读取这些颜色,以便可以调整突出显示的颜色以使其不与用户的颜色融合。

例如,如果用户选择了黄色文本,我不希望我的突出显示也为黄色,或者如果用户的背景为红色,则我不希望突出显示为红色并消失。

我检查了RTL.PDF,找不到任何东西。但是那本手册真的很长(超过2K页),我可能错过了。

我的问题:是否有与TextColor和TextBackground等效的函数,而不是设置颜色,而是返回当前设置的值? (或者,如果不是特定功能,也许还有其他方法,例如获取也包含此颜色信息的所有控制台参数。)

更新:

被“推”去处理C ++之后,去研究Windows API,我去做了所有的事情:)

幸运的是,我在Lazarus论坛中找到了一个与控制台Windows API调用无关的FreePascal示例,并将所有这些放在一起,我提出了这个建议,因为我确信它对其他人将是有用的:

{$mode fpc}
Unit Console;

Interface

uses Windows, SysUtils;

function GetTextColor: Byte;
function GetTextBackground: Byte;

Implementation

////////////////////////////////////////////////////////////////////////////////

function GetColors: Byte;
var
  vHandle :THandle;
  vScreenBufInfo :TConsoleScreenBufferInfo;
begin
  vHandle := GetStdHandle(STD_OUTPUT_HANDLE);
  if vHandle = INVALID_HANDLE_VALUE then RaiseLastOSError;
  GetConsoleScreenBufferInfo(vHandle,vScreenBufInfo);
  GetColors := vScreenBufInfo.wAttributes;
end;

////////////////////////////////////////////////////////////////////////////////

function GetTextColor: Byte;
begin
  GetTextColor := GetColors and $0F;
end;

////////////////////////////////////////////////////////////////////////////////

function GetTextBackground: Byte;
begin
  GetTextBackground := GetColors shr 4 and $0F;
end;

////////////////////////////////////////////////////////////////////////////////

begin
  //Writeln('TextColor      : ',GetTextColor);
  //Writeln('BackgroundColor: ',GetTextBackground);
end.

不过,我仍在寻找Linux解决方案。有人吗?

0 个答案:

没有答案