AllocateConsole() in VB.net(WinForms)

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Klappt es wenn da noch ein StreamWriter zwischen geklemmt ist?

    VB.NET-Quellcode

    1. If AllocConsole() Then
    2. If SetStdHandle(STD_OUTPUT_HANDLE, GetStdHandle(STD_OUTPUT_HANDLE)) Then
    3. Dim sw = New IO.StreamWriter(Console.OpenStandardOutput())
    4. sw.AutoFlush = True
    5. Console.SetOut(sw)
    6. Console.ForegroundColor = ConsoleColor.Green
    7. sw.WriteLine("Fluxoriert")
    8. End If
    9. End If
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    Sekki schrieb:

    In dem Fall funktioniert Readline aber super.
    Bei mir isser da hängengeblieben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Wenn ich den Code genauso nutze wie ich ihn dir gesendet habe, dann erwartet er von mir das ich in der Console etwas eintippe. Ich drücke Enter und erhalte die Messagebox.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.
    Ich pushe das ganze mal, da es noch keine richtige Antwort gab.
    Ich habe herausgefunden, dass in VS 2017 das Problem mit der Konsole bekannt ist und es ein Weiterleitungsfehler ist(von Microsoft(?)). Wenn ich das jetzt richtig verstanden habe jedenfalls. Das heißt, ich müsste den Write String in die Console "Redirecten"(von der VS Console zur Anwendungsconsole weiterleiten).

    Hat da jemand eine Ahnung, wie ich das anstellen könnte?

    Edit:\\ Ist es eine schlaue Idee, den Anwendungstyp unter Projekt Einstellungen --> Anwendung --> Anwendungstyp auf "Konsolenanwendung" zu stellen? Denn dann kann ich mit einem Button einfach "Console.Writeline("asd")" nutzen und eine Console wird bereits automatisch mit geöffnet. Aber ändert sich dadurch etwas großes am eigentlichen Programm? Soweit habe ich mich mit VS noch nicht auseinander gesetzt. Dadurch wird der Einstiegspunkt automatisch auf Form1 gelegt und nicht Sub Main, also es behandelt anscheinend alles noch wie eine normale Windows Forms Anwendung.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Sekki“ ()

    Sekki schrieb:

    Hat da jemand eine Ahnung, wie ich das anstellen könnte?
    Ich habe das Problem reproduziert.
    Jetzt, wo Du das mit dem Studio 2017 schreibst, fiel es mir wie Schuppen von den Augen, ich hatte mich am Wochenende nur sehr gewundert, dass die Console leer blieb.
    Probierma Console.WriteLine() gegen Console.Out.WriteLine().
    Mit Console.SetOut(...) kann man da was tun, hab ich aber noch nicht probiert:
    msdn.microsoft.com/de-de/libra…ole.setout(v=vs.110).aspx
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Mit dem StreamWriter und Console.SetOut hat es bereits @NoIde versucht und es sollte auch eigentlich funktionieren, tut es aber absolut nicht in Visual Studio 2017. Versuchte Schritte:

    - Einen StreamWriter erstellt
    - Auf die erstellte Console über "Console.SetOut(sw)" den StreamWriter Output auf die Console übertrage
    - In den StreamWriter geschrieben und den StreamWriter geschlossen

    Der Output kommt leider weiterhin nur im VS 2017 Konsolenfenster raus. Also eine wunderbare Idee, aber genau so hat Nolde diese bereits genutzt.

    Console.Out.WriteLine() hat leider ebenfalls nicht mehr Effekt als die anderen Methoden. Also, wie bereits gesagt: Alle Methoden funktionieren WUNDERBAR, jedoch gehen sie in die falsche Konsole. Hier ist eine Weiterleitung nötig, aber wie? Um Gottes Willen. Jemand hat mal einen Code im Internet gezeigt, da ging es um MarshalAs und einen UndefinedType.Bool oder sowas. Sagt euch das was? Das hat er direkt nach der AllocConsole() Funktion angefügt und es schien mir richtig, aber konnte es nicht von C# vernünftig in VB übersetzen lassen. Das ging irgendwie so:

    VB.NET-Quellcode

    1. <DllImport("kernel32.dll")>
    2. <MarshalAs UndefinedType.bool>
    3. Private Shared Function AllocConsole() As Boolean
    4. End Function


    Vollzitat entfernt. ~Thunderbolt
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    @Sekki Zur angehängten Console unter VS2017 hab ich inzwischen was gefunden, was der Beschreibung von @Nolde entspricht und auch funktioniert:
    developercommunity.visualstudi…17-works-fine-when-d.html
    Einfach eine leere C#-Form, Namespace anpassen:
    Spoiler anzeigen

    C#-Quellcode

    1. using Microsoft.Win32.SafeHandles;
    2. using System;
    3. using System.IO;
    4. using System.Runtime.InteropServices;
    5. using System.Text;
    6. using System.Windows.Forms;
    7. //https://developercommunity.visualstudio.com/content/problem/12166/console-output-is-gone-in-vs2017-works-fine-when-d.html
    8. namespace AppendConsoleNew
    9. {
    10. public partial class Form1 : Form
    11. {
    12. [DllImport("kernel32.dll", EntryPoint = "AllocConsole", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    13. private static extern int AllocConsole();
    14. [DllImport("kernel32.dll", SetLastError = true)]
    15. private static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, uint lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, uint hTemplateFile);
    16. private const int MY_CODE_PAGE = 437;
    17. private const uint GENERIC_WRITE = 0x40000000;
    18. private const uint FILE_SHARE_WRITE = 0x2;
    19. private const uint OPEN_EXISTING = 0x3;
    20. public Form1()
    21. {
    22. InitializeComponent();
    23. // Create console.
    24. AllocConsole();
    25. Console.Write("This will NOT show up in the Console window.");
    26. try
    27. {
    28. // Console.OpenStandardOutput eventually calls into GetStdHandle. As per MSDN documentation of GetStdHandle:
    29. // http://msdn.microsoft.com/en-us/library/windows/desktop/ms683231(v=vs.85).aspx will return the redirected handle and not the allocated console:
    30. // "The standard handles of a process may be redirected by a call to SetStdHandle, in which case GetStdHandle returns the redirected handle.
    31. // If the standard handles have been redirected, you can specify the CONIN$ value in a call to the CreateFile function to get a handle to a
    32. // console's input buffer. Similarly, you can specify the CONOUT$ value to get a handle to a console's active screen buffer."
    33. // Get the handle to CONOUT$.
    34. IntPtr stdHandle = CreateFile("CONOUT$", GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
    35. SafeFileHandle safeFileHandle = new SafeFileHandle(stdHandle, true);
    36. FileStream fileStream = new FileStream(safeFileHandle, FileAccess.Write);
    37. Encoding encoding = System.Text.Encoding.GetEncoding(MY_CODE_PAGE);
    38. StreamWriter standardOutput = new StreamWriter(fileStream, encoding);
    39. standardOutput.AutoFlush = true;
    40. Console.SetOut(standardOutput);
    41. Console.WriteLine("This will show up in the Console window.");
    42. Console.WriteLine();
    43. Console.WriteLine("######################");
    44. Console.Out.WriteLine("Out ######################");
    45. }
    46. catch (Exception ex)
    47. {
    48. }
    49. }
    50. }
    51. }
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!