Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Πώς παίρνω το Console handle από μία proccess?

Îåêßíçóå áðü ôï ìÝëïò odyodyodys. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 10-12-2008, 00:22. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  09-12-2008, 11:07 46790

    Πώς παίρνω το Console handle από μία proccess?

    Γεια σας,

    Έχω μπλέξει άσχημα σε μία υπόθεση και η μαμά m$ μου κάνει τη δύσκολη...

    Υπάρχει μία εφαρμογή που έχει ένα παράθυρο και μία κονσόλα ταυτόχρονα. Αυτό που ψάχνω απεγνωσμένα και δεν μπορώ να βρω
    είναι ένας τρόπος να πάρω το Handle στο console window (παραθυράκι του dos) της εφαρμογής.

    Δοκίμασα το FindWindowByCaption το οποίο δούλεψε κανονικά. Το πρόβλημα είναι ότι η συγκεκριμένη εφαρμογή τρέχει αρκετές φορές ταυτόχρονα
    και πρέπει να βρω κάποιο τρόπο να παίρνω handles σε όλες τις κονσόλες από τα instances που τρέχουν.

    Δυστυχώς η FindWindowByCaption επιστρέφει το πρώτο handle που θα βρει... και όχι όλα όσα ταιριάζουν... :(


    Αργότερα σκέφτηκα να πάρω όλα τα processes και από εκεί να βρω το handle στην κονσόλα τους, αλλά κόλλησα..


    Process[] avPlayerProcesses = Process.GetProcessesByName("notepad.exe");

    foreach (Process process in avPlayerProcesses)
    {
       IntPtr handle = process.Handle;

       // And now what???/
    }


    Σας ευχαριστώ εκ των προτέρων.



  •  09-12-2008, 11:33 46792 σε απάντηση της 46790

    Απ: Πώς παίρνω το Console handle από μία proccess?

    Θέλεις να τρέχεις εντολές στην κονσόλα μέσω της windows φόρμας; Τι ακριβώς θέλεις να κάνεις;

  •  09-12-2008, 11:53 46795 σε απάντηση της 46792

    Απ: Πώς παίρνω το Console handle από μία proccess?


    Γεια σου,

    Υπάρχει ήδη μία εφαρμογή που έχει ένα παράθυρο και μια κονσόλα ταυτόχρονα. Αυτό το πρόγραμμα τρέχει περισσότερες από μία φορές ταυτόχρονα (άρα εμφανίζονται περισσότερες από μία κονσόλες, μία για κάθε instance της εφαρμογής).

    Αυτό που θα ήθελα να κάνω είναι, με μία c# εφαρμογή να κρύψω τις κονσόλες που θα εμφανιστούν από το παραπάνω πρόγραμμα.

    Συγνώμη αν δεν ήμουν αρκετά περιγραφικός στην αρχή του νήματος Stick out tongue
  •  09-12-2008, 12:00 46796 σε απάντηση της 46790

    Απ: Πώς παίρνω το Console handle από μία proccess?

    Έλα ντε. Τί το θέλεις το Handle? Και γιατί πας μέσω Win32 API και όχι με την System.Diagnostic.Process? Όπως π.χ τη μέθοδο Process.GetProcessesByName ?

    Όσο για τα M$, το Win32 API για τα Windows υπάρχει αμετάβλητο εδώ και πάνω από 10 χρόνια. Έχει το καλύτερο documentation από οποιαδήποτε άλλη τεχνολογία, μαζί με παραδείγματα και overviews. Έχει τόσο καλή δομή, που μπορώ να σου πω τί να κοιτάξεις χωρίς καν να ανοίξω το MSDN. Κάθε ενότητα ξεκινάει με ένα overview, μετά έχει το Using και μετά το Reference. Πήγαινε στο documentation της FindWindowByCaption, κοίτα σε ποιά ενότητα είναι και μετά διάβασε το overview. Νομίζω ότι έχει και παραδείγματα πως να βρεις τα παράθυρα, κάτι έχει να κάνει με NextWindow? Αν δεν το διαβάσω όμως δεν μπορώ να σου πω.

    Μακάρι και το μεταγενέστερο documentation να ήταν τόσο καλό. Μακάρι και το documentation όλων των άλλων εταιρειών να ήταν τόσο καλό όσο το Win32 API.

    Υ.Γ. Κοιτάζοντας το MSDN βρήκα ότι αυτό που θέλεις γίνεται ακόμα και από την απλή FindWindowEx, η οποία αναζητά το επόμενο παράθυρο με το συγκεκριμένο όνομα.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  09-12-2008, 12:12 46797 σε απάντηση της 46795

    Απ: Πώς παίρνω το Console handle από μία proccess?

    Δοκίμασε αυτό:

    class Program    {       

            [DllImport("user32.dll")]       
            public static extern IntPtr FindWindow(string lpClassName,string lpWindowName);  
        
            [DllImport("user32.dll")]      

            static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

                    public static void setConsoleWindowVisibility(bool visible, string title)      
            {              
                //Sometimes System.Windows.Forms.Application.ExecutablePath

                //works for thecaption depending on the system you are running under.          
                IntPtr hWnd = FindWindow(null, "Your console windows caption");
            
                if (hWnd != IntPtr.Zero)           
                {              
                    if (!visible)                  
                        //Hide the window                   
                        ShowWindow(hWnd, 0); // 0 = SW_HIDE               
                    else                  
                         //Show window again                   
                        ShowWindow(hWnd, 1); //1 = SW_SHOWNORMA          
                 }       
            }

    }

    Ελπίζω να βοηθήσει αυτό.

  •  09-12-2008, 12:44 46800 σε απάντηση της 46797

    Απ: Πώς παίρνω το Console handle από μία proccess?

    Η FindWindow πάλι θα επιστρέψει το πρώτο παράθυρο. Πρέπει να χρησιμοποιηθεί η FindWindowEx για μπορέσει κανείς να ψάξει κανείς για τα επόμενα παράθυρα. Ο κώδικας μπορεί να γραφτεί αρκετά πιο απλά αν χρησιμοποιηθεί η Process.GetProcessesByName:

    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices;

    namespace ConsoleApplication1
    {
        class Program
        {
            [DllImport("user32.dll")]
            private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

            static void Main(string[] args)
            {
                Process[] processes=Process.GetProcessesByName("notepad");
                foreach (Process process in processes)
                {
                ShowWindow(process.MainWindowHandle, 1);
                }
            }
        }
    }


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  10-12-2008, 00:22 46814 σε απάντηση της 46800

    Απ: Πώς παίρνω το Console handle από μία proccess?

    Για λόγους πληρότητας και με τη βοήθεια του WASP addin, η ίδια δουλειά γίνεται με την παρακάτω γραμμή στο Powershell

    get-process -name notepad | %{set-windowposition $_.MainWindowHandle -minimize}

    Αρκετά συντομότερο Stick out tongue


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems