Avatar billede mcnovy Nybegynder
02. december 2007 - 02:37 Der er 6 kommentarer og
2 løsninger

Finde aktive vindue med windows API

Hej,

jeg prøver at finde ud af hvordan man finder ud af navnet på hvilket vindue der er det aktive (det i focus) (og som ikke nødvendigvis er et af mit eget programs forms)

jeg har prøvet at bruge
getforegroundvindow og den tilbagemelder med en handler, som man så kan sende videre til GetWindowText.

men getwindowtext giver kun vinduets Caption,
så istedet for f.eks. firefox, så ville den i dette tilfælde tilbagemelde
Eskperten | Opret spørgsmål - Mozilla Firefox
istedet for mit ønskede Firefox (eller endnu bedre, sti'en til programmet (c:\...\...\firefox.exe))

jeg har også prøvet at bruge process.getprocesses
men den fortæller ikke (hvad jeg ihvertfald kunne finde) hvilket vindue der er aktivt (plus at det er tidskrævende at skal kører en foreach af ca 100 processor hvergang den skal bruges (hvilket er tit)

er der nogen der har en god løsning på ovenstående..?

på forhånd tak.
Avatar billede arne_v Ekspert
02. december 2007 - 03:17 #1
Hvad med GetForegroundWindow og GetWindowModuleFileName ?
Avatar billede mcnovy Nybegynder
02. december 2007 - 12:11 #2
GetWindowModuleFileName synes jeg kun jeg kan få til at tilbagemelde filnavnet for applikationen selv..?
hvis det er et andet program der er i focus, så melder den intet tilbage...

her er koden:

        /// <summary>
        /// The GetForegroundWindow function returns a handle to the foreground window.
        /// </summary>
        [DllImport("user32.dll")]
        static extern int GetForegroundWindow();
        [DllImport("user32.dll")]
        static extern int GetWindowText(int hWnd, StringBuilder text, int count);
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern uint GetWindowModuleFileName(int hwnd, StringBuilder lpszFileName, uint cchFileNameMax);

        private string GetActiveWindow()
        {

            const int nChars = 256;
            int handle;
            StringBuilder Buff = new StringBuilder(nChars);

            handle = GetForegroundWindow();

            GetWindowModuleFileName(handle, Buff, nChars);
           
                return Buff.ToString();
           

        }

nogen der kan give et bud på hvad jeg gør galt.?
Avatar billede mcnovy Nybegynder
02. december 2007 - 13:09 #3
Jeg fandt en løsning.

Arne_V hvis du vil ha' halvdelen af point for din deltagelse, så smid et svar.

her er kode:
        /// <summary>
        /// The GetForegroundWindow function returns a handle to the foreground window.
        /// </summary>
        [DllImport("user32.dll")]
        static extern int GetForegroundWindow();
        //This Function is used to get Active process ID...

        [DllImport("user32.dll")]
        static extern Int32 GetWindowThreadProcessId(int hWnd, out Int32 lpdwProcessId);

        public static Int32 GetWindowProcessID(int hwnd)
        {

            //This Function is used to get Active process ID...

            Int32 pid;

            GetWindowThreadProcessId(hwnd, out pid);

            return pid;

        }

        private string GetActiveWindow()
        {

            const int nChars = 256;
            int handle;
            StringBuilder Buff = new StringBuilder(nChars);
            handle = GetForegroundWindow();

            int Appid = GetWindowProcessID(handle);
           
            Process test = Process.GetProcessById(Appid);

            //return test.ProcessName.ToString();
            return test.MainModule.FileName.ToString();
        }
Avatar billede mcnovy Nybegynder
04. december 2007 - 18:36 #4
Arne V,
hvis du er interesseret i point, så smid et svar,
vil gerne have tråden lukket, da der ikke er nogen grund til at holde den åben :|
tak..
Avatar billede arne_v Ekspert
04. december 2007 - 18:52 #5
kommer her
Avatar billede arne_v Ekspert
04. december 2007 - 18:52 #6
Umiddelbart burde GetFileModuleName virke men det goer det ikke - MS har givet en
forklaring her:

http://support.microsoft.com/?id=228469
Avatar billede mcnovy Nybegynder
04. december 2007 - 19:21 #7
hmm, det forklarer ihvertfald hvorfor jeg ikke kan få det til at virke..  :)
men der er jo så evt to alternativer kan jeg se, men om den fungere bedre en det jeg har bixet sammen, det er jo svært at sige.

men ihvertfald skal du ha tak for hjælpen
Avatar billede arne_v Ekspert
04. december 2007 - 19:35 #8
Begge alternativerne gaar ogsaa via process id som din loesning. De bruger bare en
Win32 metode fremfor en .NET metode til at finde filnavn udfra process id.
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