Wie kann ich Bilder in eine cmd Konsole einbetten?

8 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Das geht nicht...

Außer man ist Erzesel und mogelt ganz fies...🤭🤥🤫

Theoretisch kann man mit einer Konsolenanwendung mehr oder weniger gewaltsam ein Bild über ein Consolfenster "bügeln". Allerdings das Bild ist dann nichtmal wirklich Bestandteil des Consolfenster, sondern mehr oder weniger nur an die passende Stelle gemalt.

Du hast auch nicht geschrieben in welcher Programmiersprache Du Deine .exe programmierst?

Hier ein kleines Programm in C# wie man sowas zurechtmogeln könnte...:

ddraw_Demo.cs

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Threading;

namespace DIRECTDRAW
{
    class Program
    {
        [DllImport("user32.dll")]
        static extern IntPtr GetDC(IntPtr hwnd);

        static void draw(Rectangle r, Brush b, IntPtr hwnd)
        {
            using (Graphics g = Graphics.FromHdc(hwnd))
            {
                g.FillRectangle(b, r);
            }
        }

        static void Main(string[] args)
        {
            int w = 100;
            int h = 100;


            Point xy = new Point(960 - w, 540 - h);
            draw(new Rectangle(xy, new Size(w, h)), new SolidBrush(Color.Red), GetDC(IntPtr.Zero));
            Thread.Sleep(1);
            Main(args);
        }
    }
}

...ich verzichte auf den Code zum Laden und Zeichnen eines Bildes.. wei es einfach Unsinn ist. (deshalb nur ein rotes 4eck) ...und natürlich darfst Du das Fenster nicht verschieben, dann fliegt der Schwindel auf ( eine routine welche das Bild mitnimmt war mir dann zuviel Aufwand für eine Demo)😤

In Batch ist sowas absolut nicht machbar, außer man mogelt noch mehr...

fake_format_mit Bild.bat

<!-- : Begin batch script 
start "" mshta.exe "%~f0" 
exit /b
-->
<title>Console</title>
  <hta:application 
    applicationname="Fake Console"
    border="thin"
    borderstyle="no"
    caption="yes"
    contextmenu="no"
    icon="no"
    innerborder="no"
    maximizebutton="yes" 
    minimizebutton="yes"
    navigable="no" 
    scroll="no"
    scrollflat="no" 
    selection="no"
    singleinstance="yes"
    sysmenu="yes" >
<html>
  <head>
  <meta charset="UTF-8">
  <style type="text/css">
    body{
    margin: 0;
    font-family: "Consolas";
    font-size: 14px;
    color: lightgray;  /* global Fontcolor*/    
    background-color: Black; 
    }
  </style>
  <script>
    function Window_onLoad()
    {
      window.resizeTo(1000,480);
      var count=0;
      myVar = setInterval(function(){
        count++
        document.getElementById("Fake").innerHTML = 'formatieren von Laufwerk C: ......'+count+'%';
        if (count==100) {
          document.getElementById("Fake2").innerHTML = 'Danke  für die Panik /rolfl/';
          clearInterval(myVar)
        }
      
      }, 2000);
    }
  </script>
  </head>
  <body onload="Window_onLoad()" >
    <div>
      Microsoft Windows [Version 10.0.18363.778]<br>
      (c) 2019 Microsoft Corporation. Alle Rechte vorbehalten.<br><br>
      C:\WINDOWS\system32>format C: /FS:NTFS /x<br>
      <p id="Fake">formatieren von Laufwerk C: ......0%</p>
      <div id="Fake2"></div>
    </div>
    <img width=200 height=200 alt="Erzesel Alien Mod" src="data:image/png;base64,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">
    
  </body>
</html>

Natürlich wird nichts formatiert und die Batch ist etwas mehr als nur eine Batch (mit etwas HTML und Javascript aufgepimpt). Aber das merkt ja erstmal keiner...🤭

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
Nyrow 
Fragesteller
 30.04.2020, 22:51

Danke für deine Umfangreiche antwort ^^ Ich versuche es mittlerweile mit cmdbkg womit das Bild hinter die Konsole geschoben wird und es mit der Konsole verschoben wird m.

1
Erzesel  01.05.2020, 05:44
@Nyrow

Danke für den Tipp. Ich habe mir mal den Quelltext des Programms angeschaut. Mit meinem 2.Ansatz und dem Gedanken das das Fenster zu belauschen und in einer Endlosschleife das Bild neu zu schreiben lag ich schon mal garnicht so verkehrt.

Das Programm macht das Originafenster unsichtbar und startet eine leere Kopie, pollt im Hintergrund und baut alle 10 Millisekunden den kompletten Clientbereich des neuen Fensters mit den Daten aus dem Originnal neu auf...brutal .🥵 damit laufen 3 Prozesse gleichzeitig. Der Überwachungsprozess, Console mit der Batch und das Consolfenster in welches das Hintergrundbild und die Ausgabe des Originals geschrieben werden. )

😅Es klappt und das ist wichtig.

Das ganze sieht auch prima aus.

Ich würde jedoch für den Dauerbetrieb davon abraten, da das Programm ziemlich mit den Systemresourcen wuchert und als überwachender Prozess im Hintergrund mit seinem Polling ständig CPU-Last erzeugt (auch wenn das bei heutige schnellen Prozessoren kaum ins Gewicht fällt).

1

Die Konsole im Video scheint eine Eigenkreation zu sein.
Die einfache Windows--Konsole ist für solche Aufgaben nicht gemacht.
Eine ASCII - Grafik wäre ganz passend dafür; oder als Text.

Ich hatte mir heute mal Gedanken gemacht wie man ein Bild in einer Consolanwendung einbinden könnte und auch noch das richtige Fenster erwischt in dessen Clientbereich man das Bild pinselt.

Bild zum Beitrag

...insofern bewahrheitet sich mein Motto wieder einmal: "Geht nicht gibt's nicht".

...aber natürlich mogle ich auch hier, aber immerhin wurde das Bild in das Consolfenster geklatscht... insofern geht es Doch...

Das funktioniert übrigens mit jedem Fenster, man muss nur FindWindow(null, @"Zielfenstertitel"); anpassen 🤫.

Letztlich bleibt es trotzdem eine "Vergewaltigung" , da das System nichts von der Aktion erfährt.

Man kann zwar das Fenster samt Inhalt verschieben, jedoch wird das Bild bei jeder Aktion , welche den Fensterinhalt neu zeichnet beseitigt. (Logisch..., wenn es "illegal" angepappt wurde.

Natürlich könnte man am System lauschen und bei jedem Neuzeichnen auch das Bild neu pinseln..., das liefe jedoch auf einen eigenen Globalen Eventhandler hinaus😱🥶 ..oder man schreibt in einer Endlosschleife in einem extra Threat das Bild ständig neu.

Man kann auch statt des Base64-Bildes ein externes Bild laden...

Es bleibt eine Spielerei für Leute denen nicht s heilig ist...

test.cs

using System;
using System.IO;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Threading;


class Program
{
    [DllImport("user32.dll")] static extern IntPtr FindWindow(String lpClassName, String lpWindowName);
    static void Main(string[] args)
    {
        //FensterTitel setzen Wichtig!, sonst kann das ZielFenster nicht selektiert werden
        Console.Title = "blubb";
        //Gib dem System einige Millisekunden um den Neuen FensterTitel zu veröffentlichen
        Thread.Sleep(10);
        //Bild als Base64-String einbinden (ähnlich HTML)
        Bitmap img = new Bitmap(new MemoryStream(Convert.FromBase64String("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")));
        //Bildposition im Zielfenster mit Titel=Blubb x=100 y=200Pixel von unten Width=100 Hight=100
        IntPtr hWnd = FindWindow(null, @"blubb");
        Graphics g = Graphics.FromHwnd(hWnd);
        g.DrawImage(img, 100, g.VisibleClipBounds.Height-(200),100,100);
        //wichtig! Resource wieder Freigeben , sonst gibts ein Memoryleak 
        g.Dispose();
        Console.WriteLine("Blah & Blubb");
        Console.WriteLine("Muff & Meff");
        Console.WriteLine("Laberrhababer");
        Console.ReadKey();
    }
}

compile_C#.cmd

@echo off
chcp 65001 >nul
if "%~1"=="" (
    echo C# Compiler-Batch.
    echo:
    echo Ziehe eine Datei mit C#-Source auf "%~nx0" ...
    timeout 7
    exit /b
)
for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*csc.exe"') do (
set "csc=%%v"
)
if "%csc%"==""  (
echo Kein C#-Compiler gefunden
echo Bitte installiere Microsoft-.NetFramework!
pause
exit /b
)
echo "%csc%" gefunden.
"%csc%" /nologo /out:"%~dpn1.exe" "%~1" >compile.log && (
    echo success...
    echo .... %~dpn1.exe...
    start "" "%~dpn1.exe"
    timeout 20 >nul
) || (
    echo Compilererror...
    echo:
    type compile.log
    echo:
    pause
)
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
 - (Computer, Technik, Technologie)

Bilder in der Konsole? Ich glaube nicht, dass Windows das unterstützt... Unter Unix können das einige Terminals, w3m kann auch Bilder in TTY rendern.

Woher ich das weiß:Studium / Ausbildung – Student der Informatik an der HU Berlin

Also die Standardkonsole kann das nicht.

Du könntest natürlich die Konsole nachbilden und deine Nachbildung könnte Bilder unterstützen, wenn Du das implementierst.

Gruß