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;
}
}