Avatar billede scorp-d Nybegynder
25. marts 2009 - 13:09

Få fat i første vindue på hver skærm(multiscreen)

Hej.

Er sådan set meget simpelt det jeg vil, men indtil videre har det været et værre bøvl.
Jeg vil gerne, rent programmeringsmæssigt, sætte det forreste vindue på en bestemt skærm som aktiv, altså hvis jeg fx har 3 skærme, så skal jeg kunne sætte det forreste vindue i skærm nr. 2 til at være aktiv/sætte fokus.

Har nedenstående kode som køre igennem hver WindowStation, deres Desktops og deres DesktopWindows, men kan ikke rigtig adskille hvad der afvikles på hvilken skærm(Hvis det overhovedet er muligt ).

Jeg finder disse 6 stations når jeg har 2 skærme koblet på:

WinSta0
Service-0x0-3e7$
Service-0x0-3e4$
Service-0x0-3e5$
SAWinSta
Msswindowstation

Hver af de stations har så nogle desktops:

Default
Disconnect
WinLogon
+ Stations-navnene.

Hver af de desktop har så flere hundred DesktopWindows.

Hvis jeg går ind og laver en SetForegroundWindow på en tilfældig DesktopWindow virker det udmærket, men vil bare gerne kunne adskille på skærm-niveau.

Kode:
class EnumClass
    {

        public delegate bool EnumWinStaProc(string StationName, int lParam);
        public delegate bool EnumWinProc(int hwnd, int lParam);
        public delegate bool EnumDeskTopProc(string DeskTopName, int lParam);

        [DllImport("user32.Dll")]
        public static extern int EnumWindowStations(EnumWinStaProc x, int y);

        [DllImport("user32.Dll")]
        public static extern int EnumDesktopWindows(IntPtr DeskTopHandle, EnumWinProc x, int y);

        [DllImport("User32.Dll")]
        public static extern void GetWindowText(int h, StringBuilder s, int nMaxCount);

        [DllImport("user32.Dll")]
        public static extern IntPtr OpenWindowStation(string StationName, bool InheritHandle, long AccessMask);

        [DllImport("user32.Dll")]
        public static extern IntPtr OpenDesktop(String DeskTopName, long Flags, bool Inherit, long Access);

        [DllImport("user32.Dll")]
        static extern bool EnumDesktops(IntPtr StationHandle, EnumDeskTopProc x, int lParam);

        [DllImport("user32.Dll")]
        public static extern bool CloseWindowStation(IntPtr StationHandle);

        [DllImport("user32.Dll")]
        public static extern bool CloseDesktop(IntPtr DeskTopHandle);


        public void DoEnumWindowStations(int lParam)
        {
            EnumWindowStations(new EnumWinStaProc(EnumWindowStaCallBack), lParam);           
        }

        IntPtr windowHandle;
        string stationname;
        string desktopname;
        string desktopWindows;

        bool EnumWindowStaCallBack(string StationName, int lParam)
        {
            stationname = StationName;
            IntPtr StationHandle = (IntPtr)null;
            StationHandle = OpenWindowStation(StationName, false, 0x10000000L);
            EnumDesktops(StationHandle, new EnumDeskTopProc(EnumDeskTopCallBack), lParam);
            CloseWindowStation(StationHandle);
            return true;
        }


        bool EnumDeskTopCallBack(string DeskTopName, int lParam)
        {
            desktopname = DeskTopName;
            IntPtr DeskTopHandle = (IntPtr)null;
            DeskTopHandle = OpenDesktop(DeskTopName, 0, true, (long)0x41);
            EnumDesktopWindows(DeskTopHandle, new EnumWinProc(EnumWindowCallBack), 0);
            CloseDesktop(DeskTopHandle);
            return true;
        }

        bool EnumWindowCallBack(int hwnd, int lParam)
        {
            windowHandle = (IntPtr)hwnd;
            IntPtr pid = IntPtr.Zero;
            StringBuilder sb = new StringBuilder(1024);
            GetWindowText((int)windowHandle, sb, sb.Capacity);
            desktopWindows =  windowHandle.ToString() + " : " + sb;
            return true;
        }
    }
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