Avatar billede donnib Nybegynder
19. oktober 2003 - 13:51 Der 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.

Mihai
Avatar billede billen Nybegynder
19. oktober 2003 - 13:55 #1
du kan vel bare tjekke length på string[] args fra Main metoden.
Avatar billede donnib Nybegynder
19. oktober 2003 - 14:03 #2
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 ?

Mihai
Avatar billede billen Nybegynder
19. oktober 2003 - 14:29 #3
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.

Just a thought.
Avatar billede donnib Nybegynder
19. oktober 2003 - 14:35 #4
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)

Mihai
Avatar billede arne_v Ekspert
19. oktober 2003 - 14:36 #5
En mulig løsning er at (hvis logikke vælger at det skal være en
console app) kalde Win32 API funktionerne:

AllocConsole
GetStdHandle
WriteConsole
ReadConsole
FreeConsole

Lidt bøvlet - men muligt.
Avatar billede donnib Nybegynder
19. oktober 2003 - 14:40 #6
Øhh den er jeg desværre ikke helt med på. Kan du uddybe det lidt mere ?
Avatar billede arne_v Ekspert
19. oktober 2003 - 14:42 #7
Jeg prøver at lave et eksempel.
Avatar billede arne_v Ekspert
19. oktober 2003 - 15:06 #8
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();

        }
    }           
}
Avatar billede arne_v Ekspert
19. oktober 2003 - 15:08 #9
Jeg vil ikke ligge hoveder på blokken for at kaldene er helt
korrekte, men jeg kan ihvertfald se "Hello world".

Til seriøst brug skal det hele jo nok pakkes ind i nogle
praktiske metoder.
Avatar billede arne_v Ekspert
19. oktober 2003 - 15:35 #10
Forbedret eksempel:

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();

        }
    }           
}
Avatar billede arne_v Ekspert
19. oktober 2003 - 15:36 #11
Jeg vil ikke kalde det køn kode.

Men grundliggende er programmer beregnet til enten at være windows eller
console programmer.

Vil man begge så må man fifle lidt.
Avatar billede arne_v Ekspert
19. oktober 2003 - 15:36 #12
Og et svar såfremt der ikke er nogen som kommer op med en bedre løsning.
Avatar billede donnib Nybegynder
19. oktober 2003 - 16:25 #13
er der virkelig ikke en smartere måde at gøre det på ? Jeg har endnu ikke prøvet det her kode endnu.

Mihai
Avatar billede arne_v Ekspert
19. oktober 2003 - 16:27 #14
Jeg kan ikke finde en smartere metode.

Men vent og se - måske kan andre komme op med noget smart.
Avatar billede arne_v Ekspert
04. november 2003 - 00:02 #15
Tid at lukke spørgsmålet ?
Avatar billede arne_v Ekspert
11. december 2003 - 21:42 #16
??
Avatar billede donnib Nybegynder
22. januar 2004 - 09:39 #17
Jeg har fundet en anden metode også men tak for svaret.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester