Nachdem ich (in meinem vorherigen Thread) mit den Tücken von GetWindowRect() unter Aero gekämpft habe, hänge ich jetzt bei einem Problem mit der Taskbar fest.
Situation:
Ich habe 2 Monitore, von denen der Rechte der Hauptmonitor ist, beide mit Auflösung 1920x1200.
Der virtuelle Desktop reicht also von -1920x0 bis +1920x1200.
Die Taskbar lässt sich nach Belieben verschieben, an alle 8 Ränder der beiden Monitore.
Default Position der Taskbar wäre 0,1170,1920,30, aber das könnte auch -60,0,60,1200 sein und falls ich einem der beiden Monitore eine andere Auflösung gebe, wird das Ganze noch trickreicher.
Und überhaupt, es könnte auch User geben, mit 2 Monitoren übereinander, wo die Taskbar dann bei 0,-30,1920,30 liegen könnte.
Ich brech mir einen ab mit GetWindowRect(), GetMonitorInfo(), Berechnung von Rahmen usw., und am Ende blicke ich nicht mehr durch.
Hier mal der Code den ich im Moment habe, ohne Berücksichtigung der Taskbar.
Wie prüfe ich jetzt, ob mein Fenster sich mit der Taskbar überschneidet und verschiebe es bei Bedarf?
Situation:
Ich habe 2 Monitore, von denen der Rechte der Hauptmonitor ist, beide mit Auflösung 1920x1200.
Der virtuelle Desktop reicht also von -1920x0 bis +1920x1200.
Die Taskbar lässt sich nach Belieben verschieben, an alle 8 Ränder der beiden Monitore.
Default Position der Taskbar wäre 0,1170,1920,30, aber das könnte auch -60,0,60,1200 sein und falls ich einem der beiden Monitore eine andere Auflösung gebe, wird das Ganze noch trickreicher.
Und überhaupt, es könnte auch User geben, mit 2 Monitoren übereinander, wo die Taskbar dann bei 0,-30,1920,30 liegen könnte.
Ich brech mir einen ab mit GetWindowRect(), GetMonitorInfo(), Berechnung von Rahmen usw., und am Ende blicke ich nicht mehr durch.
Hier mal der Code den ich im Moment habe, ohne Berücksichtigung der Taskbar.
Code:
// Variablen werden aus config.ini gelesen, sofern vorhanden
bool WindowPosIsSet = 0;
int WindowLeft = 0;
int WindowTop = 0;
HWND hwnd,hStatusbar;
bool SetMainWindow()
{
// fenster irgendwohin setzen
MoveWindow(hwnd,0,0,720,450,0);
SendMessage(hStatusbar,WM_SIZE,0,0);
// position lesen und dimension berechnen
RECT windowrect,clientrect,statusrect = {0};
GetWindowRect(hwnd,&windowrect);
GetClientRect(hwnd,&clientrect);
GetClientRect(hStatusbar,&statusrect);
int borderwidth = (windowrect.right - windowrect.left) - (clientrect.right - clientrect.left);
int borderheight = (windowrect.bottom - windowrect.top) - (clientrect.bottom - clientrect.top);
int totalwidth = 720 + borderwidth;
int totalheight = 450 + borderheight + statusrect.bottom;
// fenster in richtiger grösse positionieren
if(!WindowPosIsSet)
{
POINT LeftTopEdge = {0,0};
MONITORINFO mi = {0};
mi.cbSize = sizeof(mi);
GetMonitorInfo(MonitorFromPoint(LeftTopEdge,MONITOR_DEFAULTTONEAREST),&mi);
MoveWindow(hwnd,(mi.rcWork.right / 2) - (totalwidth / 2),(mi.rcWork.bottom / 2) - (totalheight / 2),totalwidth,totalheight,0);
}
else
{
MoveWindow(hwnd,WindowLeft,WindowTop,totalwidth,totalheight,0);
}
// nur wegen Aero nochmal prüfen
GetWindowRect(hwnd,&windowrect);
GetClientRect(hwnd,&clientrect);
totalwidth = totalwidth - (clientrect.right - 720);
totalheight = totalheight - (clientrect.bottom - (450 + statusrect.bottom));
// neue position setzen
MoveWindow(hwnd,windowrect.left,windowrect.top,totalwidth,totalheight,0);
SendMessage(hStatusbar,WM_SIZE,0,0);
GetWindowRect(hwnd,&windowrect);
// Desktop checken
int ScreenWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
int ScreenHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN);
int LeftEdge = GetSystemMetrics(SM_XVIRTUALSCREEN);
int TopEdge = GetSystemMetrics(SM_YVIRTUALSCREEN);
// fensterposition und grösse mit desktop vergleichen
if(totalwidth > ScreenWidth || totalheight > ScreenHeight)
{
// error desktop zu klein
return 0;
}
if(windowrect.left + totalwidth > ScreenWidth)
{
windowrect.left = ScreenWidth - totalwidth;
}
if(windowrect.top + totalheight > ScreenHeight)
{
windowrect.top = ScreenHeight - totalheight;
}
if(LeftEdge > windowrect.left)
{
windowrect.left = LeftEdge;
}
if(TopEdge > windowrect.top)
{
windowrect.top = TopEdge;
}
// taskbar checken
RECT taskrect = {0};
GetWindowRect(FindWindow(L"Shell_traywnd",0),&taskrect);
// hier weiss ich nicht mehr weiter
return 1;
}
Wie prüfe ich jetzt, ob mein Fenster sich mit der Taskbar überschneidet und verschiebe es bei Bedarf?