Как узнать фон консоли и цвета текста? - PullRequest
0 голосов
/ 19 июня 2019

* НЕ ДУБЛИКАТ *, поскольку это относится только к C ++ и Windows.

(В настоящее время для Windows, но решение также подходит для Linux.)

У меня есть приложение, которое использует TextColor и / или TextBackground для выделения текста. Поскольку пользователь может изменять настройки консоли по умолчанию, я хотел бы иметь возможность читать эти цвета, чтобы я мог настроить цвет своих бликов так, чтобы они не смешивались с цветами пользователя.

Например, если пользователь выбрал желтый текст, я не хочу, чтобы моя подсветка тоже была желтой, или если фон пользователя красный, я не хочу, чтобы подсветка была красной и исчезала.

Я проверил RTL.PDF и не смог ничего найти. Но это руководство действительно длинное (2К + страниц), и я, возможно, пропустил его.

Мой вопрос: существуют ли функции, эквивалентные TextColor и TextBackground, которые вместо установки цветов возвращают текущие установленные значения? (Или, если не конкретные функции, возможно, какой-то другой метод, например получение всех параметров консоли, которые также содержат эту информацию о цвете.)

UPDATE:

После того, как меня «подтолкнули» разобраться с C ++ и изучить Windows API, я пошел и сделал все это:)

К счастью, я нашел несвязанный пример FreePascal для консольного вызова Windows API на форуме Lazarus, и, собрав все это вместе, я пришел к этому, который я публикую, так как уверен, что он будет полезен для других:

{$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. Кто-нибудь?

...