19. oktober 2003 - 13:51Der er
16 kommentarer og 1 løsning
Hvordan laver man et program som både er Konsol og Windows vindue
Hej, Jeg er interesseret hvordan jeg skal lave et program som både er konsol dvs kommandolinie og windows baseret. Det skal være sådan at når der ikke bliver givet argumenter skal den starte som windows vindue ellers skal det være kommandolinje baseret.
ja det kan jeg godt tænke mig til men hvordan opretter jeg selve konsol vinduet og ikke formen ? Altså jeg kan godt se/tænke mig til at jeg ikke skal køre Application.Run(new form) men hvad skal jeg så køre for at oprette konsol vinduet ?
ok... men egentlig synes jeg ikke at det er dit ansvar at oprette et konsolvindue. Jeg går ud fra at du vil bruge konsollen til en slags tekst interface til dit program? Det må da vel egentlig være brugeren som skal kalde dit program, fra den konsol han nu ønsker. Så kan han jo også putte de parametre på som jo skal til.
Jamen jeg vil gerner have at brugeren kan bestemme selv om han vil køre programmet i Windows Form eller i consolmode hvor han giver programmet de parametre han vil som argumenter. Konsolprogrammet vil så tage argumenterne og spytte ud hvorvidt det er gået godt eller ej (dvs. skrive ud i konsolvinduet hvad fejlene var)
using System; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices;
namespace MyFormProject { class MainForm : System.Windows.Forms.Form { private const uint STD_INPUT_HANDLE = 0xfffffff6; private const uint STD_OUTPUT_HANDLE = 0xfffffff5; private const uint STD_ERROR_HANDLE = 0xfffffff4; [DllImport("kernel32.dll")] public static extern bool AllocConsole(); [DllImport("kernel32.dll")] public static extern bool FreeConsole(); [DllImport("kernel32.dll")] public static extern int GetStdHandle(uint nStdHandle); [DllImport("kernel32.dll")] public static extern bool WriteConsole(int hConsoleOutput, string lpBuffer, int nNumberOfCharsToWrite, ref int lpNumberOfCharsWritten, int lpReserved); [DllImport("kernel32.dll")] public static extern bool ReadConsole(int hConsoleInput, StringBuilder lpBuffer, int nNumberOfCharsToRead, ref int lpNumberOfCharsRead, int lpReserved);
public MainForm() { InitializeComponent(); }
void InitializeComponent() { // // Set up generated class MainForm // this.SuspendLayout(); this.Name = "MainForm"; this.Text = "This is my form"; this.Size = new System.Drawing.Size(300, 300); this.ResumeLayout(false); }
[STAThread] public static void Main(string[] args) { //Application.Run(new MainForm()); AllocConsole(); int stdin = GetStdHandle(STD_INPUT_HANDLE); int stdout = GetStdHandle(STD_OUTPUT_HANDLE); string s = "Hello world"; int len = 0; WriteConsole(stdout, s, s.Length, ref len, 0); StringBuilder sb = new StringBuilder(); ReadConsole(stdin, sb, 256, ref len, 0); FreeConsole();
using System; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices;
namespace MyFormProject { class MainForm : System.Windows.Forms.Form { public MainForm() { InitializeComponent(); }
void InitializeComponent() { // // Set up generated class MainForm // this.SuspendLayout(); this.Name = "MainForm"; this.Text = "This is my form"; this.Size = new System.Drawing.Size(300, 300); this.ResumeLayout(false); }
private const uint STD_INPUT_HANDLE = 0xfffffff6; private const uint STD_OUTPUT_HANDLE = 0xfffffff5; private const uint STD_ERROR_HANDLE = 0xfffffff4; [DllImport("kernel32.dll")] public static extern bool AllocConsole(); [DllImport("kernel32.dll")] public static extern bool FreeConsole(); [DllImport("kernel32.dll")] public static extern int GetStdHandle(uint nStdHandle); [DllImport("kernel32.dll")] public static extern bool WriteConsole(int hConsoleOutput, string lpBuffer, int nNumberOfCharsToWrite, ref int lpNumberOfCharsWritten, int lpReserved); [DllImport("kernel32.dll")] public static extern bool ReadConsole(int hConsoleInput, StringBuilder lpBuffer, int nNumberOfCharsToRead, ref int lpNumberOfCharsRead, int lpReserved); private static int stdin; private static int stdout; private static void WriteLine(string s) { int len = 0; WriteConsole(stdout, s + "\r\n", s.Length + 2, ref len, 0); } private static string ReadLine() { int len = 0; StringBuilder sb = new StringBuilder(); ReadConsole(stdin, sb, 256, ref len, 0); return sb.ToString(0, sb.Length - 2); } [STAThread] public static void Main(string[] args) { //Application.Run(new MainForm()); AllocConsole(); stdin = GetStdHandle(STD_INPUT_HANDLE); stdout = GetStdHandle(STD_OUTPUT_HANDLE); WriteLine("Enter line below"); string s = ReadLine(); WriteLine(s); WriteLine("Press enter to exit"); ReadLine(); FreeConsole();
Jeg har fundet en anden metode også men tak for svaret.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.