Struktur _CONSOLE_FONT_INFOEX in AutoIt darstellen

    • Offizieller Beitrag

    Ich bin mal wieder über meine vor Urzeiten angefangene Console-UDF gestolpert. Damals hatte ich nur einige rudimentäre Umsetzungen gemacht. Nun wollte ich die gesamte Console API in Angriff nehmen und bin dabei über folgende Struktur gestolpert:

    Code: https://docs.microsoft.com/en-us/windows/console/console-font-infoex
    typedef struct _CONSOLE_FONT_INFOEX {
    ULONG cbSize;
    DWORD nFont;
    COORD dwFontSize;
    UINT  FontFamily;
    UINT  FontWeight;
    WCHAR FaceName[LF_FACESIZE];
    } CONSOLE_FONT_INFOEX, *PCONSOLE_FONT_INFOEX;

    Das würde ich in AutoIt erstmal so umsetzen:

    Unklar ist mir: WCHAR FaceName[LF_FACESIZE];

    Als Bsp. für eine Umsetzung in C# habe ich hier was gefunden:

    Code
    // Set console font to Lucida Console.
    CONSOLE_FONT_INFO_EX newInfo = new CONSOLE_FONT_INFO_EX();
    newInfo.cbSize = (uint) Marshal.SizeOf(newInfo);
    newInfo.FontFamily = TMPF_TRUETYPE;
    IntPtr ptr = new IntPtr(newInfo.FaceName);
    Marshal.Copy(fontName.ToCharArray(), 0, ptr, fontName.Length);
    // Get some settings from current font.
    newInfo.dwFontSize = new COORD(info.dwFontSize.X, info.dwFontSize.Y);
    newInfo.FontWeight = info.FontWeight;
    SetCurrentConsoleFontEx(hnd, false, newInfo);

    Die interessanten Zeilen für FaceName sind hier:

    Code
    IntPtr ptr = new IntPtr(newInfo.FaceName);
    Marshal.Copy(fontName.ToCharArray(), 0, ptr, fontName.Length);

    Daraus würde ich jetzt schließen, dass ich das so umzusetzen habe:

    Habe ich das soweit richtig interpretiert?


    Ein zweiter Punkt:

    Die Struktur enthält die eingebettete Struktur COORD. Durch das Integrieren mittels: 'STRUCT;' & $tag_COORD & 'ENDSTRUCT;' geht mir ja der Feldname dwFontSize verloren.

    In C# wird in dem Bsp. auf X in dwFontSize mit info.dwFontSize.X zugegriffen. In meiner Umsetzung wäre das im Moment: $t_CONSOLE_FONT_INFOEX.X Grundsätzlich kein Problem, solange nicht eine zweite eingebettete Struktur mit denselben Feldern auftaucht.

    Aber genau das passiert z.B. in folgender Struktur:

    Code
    typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
      COORD      dwSize;
      COORD      dwCursorPosition;
      WORD       wAttributes;
      SMALL_RECT srWindow;
      COORD      dwMaximumWindowSize;
    } CONSOLE_SCREEN_BUFFER_INFO;

    Wie kann ich das lösen? Bleibt da nur der Zugriff über den Index?

    EDIT:

    Oder so?

  • Hi BugFix

    Unklar ist mir: WCHAR FaceName[LF_FACESIZE];

    Dies ist ein Array mit dem Typ WCHAR.

    Die Definition könnte so aussehen:

    AutoIt
    Global Const $tagCONSOLE_FONT_INFOEX = "ULONG cbSize; DWORD nFont; SHORT X; SHORT Y; UINT dwFontFamily; UINT FontWeight;wchar FaceName[32];"

    CONSOLE_SCREEN_BUFFER_INFO:

    AutoIt
    Global Const $tagCONSOLE_SCREEN_BUFFER_INFO = "SHORT dwSizeX; SHORT dwSizeY; SHORT dwCursorPositionX;SHORT dwCursorPositionY;" & 
                                                                                        "SHORT wAttributes; SHORT srWindowLeft; SHORT srWindowTop; SHORT srWindowRight; SHORT srWindowBottom;" & _
                                                                                        "SHORT dwMaximumWindowSizeX; SHORT dwMaximumWindowSizeY"

    Ich wollte auch damit Anfangen eine Console UDF zu basteln, habe aber mich daran erinnert, dass Mat beriets eine fast vollständige Consolen UDF gebastelt hatte -> https://code.google.com/archive/p/consoleau3/downloads.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • In der Console.au3 hat sich in einem der Funktionsheader ein kleiner Fehler eingeschlichen, der auch in der Console.api übernommen wurde.

    Hier wird ein falscher Funktionsname verwendet:

    _Console_GetScreenBufferFullscreen( [ $hConsoleOutput [, $hDll ]] ) Retrieves the specified console screen buffer's color settings.

    Richtig ist:

    _Console_GetScreenBufferColorTable( [ $hConsoleOutput [, $hDll ]] ) Retrieves the specified console screen buffer's color settings. (Requires: #include <Console.au3>)


    Ob die ersten beiden Zeilen etwas in einer UDF zu suchen haben, lasse ich mal dahingestellt... ich habe sie bei mir jedenfalls ausdokumentiert.

    #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 

    #Tidy_Parameters=/gd /gds /sf

    • Offizieller Beitrag

    Ob die ersten beiden Zeilen etwas in einer UDF zu suchen haben, lasse ich mal dahingestellt... ich habe sie bei mir jedenfalls ausdokumentiert.

    Danke für den Hinweis.

    Das sehe ich ebenso. Stattdessen ist ein #include-once angebracht wegen des WinAPI-Includes.

    Ebenfalls aufgefallen ist mir in der Struktur: $tagCONSOLE_FONT_INFOEX

    wchar[32] FaceName;

    sollte eigentlich

    wchar FaceName[32];

    sein.

    Bin mir nicht sicher ob es funktionell falsch ist, aber ich kenne es eigentlich nur in der letzteren Schreibweise.