Ik ben bezig met een projectje in VC2003, en ben nu aangekomen bij een lastig probleem. Ik heb namelijk de virtuele desktop positie nodig. Bij een enkele monitor is dit bijvoorbeeld 0,0 - 1024,768, maar bij een multi monitor setup zou dit bijvoorbeeld 0,0 - 2048,768 kunnen zijn.
de WM_MOVE event geeft de coordinaten terug van de "huidige" monitor waar het venster op dat moment op/naar versleept is. Nu heb ik al aardig wat geexperimenteerd met stukjes code zoals:
Deze gebruikt echter ook gewoon de huidige monitor.
Geeft de monitor aan, maar je weet helaas niet wat de volgorde is van de monitoren (2 - 1 , 1 - 2, of misschien ook nog op de Y as?)
Bovenstaande + het volgende:
Geeft uiteraard ook weer heel mooi de coordinaten, van de huidige monitor. De uitkomst is dan ook precies hetzelfde als wat x en y al waren meende ik.
Geeft heel mooi 2560 aan (2x 1280), maar ja, daar heb ik helaas weinig aan.
Het enige wat ik kan bedenken is om zelf de virtuele desktop te berekenen door alle monitoren te enumereren die actief zijn, en dan met GetMonitorInfo bijvoorbeeld de volgorde te bepalen (via de min/max waardes), en om dan uiteindelijk daarmee de echte virtuele positie te berekenen. Helaas klinkt dit a) omslachtig en b) fout gevoelig.
Dus ik vroeg me af of iemand hier nog suggesties heeft qua API calls misschien? of andere ideeen?
de WM_MOVE event geeft de coordinaten terug van de "huidige" monitor waar het venster op dat moment op/naar versleept is. Nu heb ik al aardig wat geexperimenteerd met stukjes code zoals:
code:
1
2
3
| WINDOWPLACEMENT wp;
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement( &wp ); |
Deze gebruikt echter ook gewoon de huidige monitor.
code:
1
| HMONITOR hMonitor = ::MonitorFromPoint( CPoint(x, y), MONITOR_DEFAULTTONEAREST ); |
Geeft de monitor aan, maar je weet helaas niet wat de volgorde is van de monitoren (2 - 1 , 1 - 2, of misschien ook nog op de Y as?)
Bovenstaande + het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
| // Get the monitor info
MONITORINFO monInfo;
monInfo.cbSize = sizeof(MONITORINFO);
if(::GetMonitorInfo( hMonitor, &monInfo )==0)
{
//AfxMessageBox("GetMonitorInfo failed");
//return(FALSE);
}
// Adjust for work area
x += monInfo.rcWork.left - monInfo.rcMonitor.left;
y += monInfo.rcWork.top - monInfo.rcMonitor.top; |
Geeft uiteraard ook weer heel mooi de coordinaten, van de huidige monitor. De uitkomst is dan ook precies hetzelfde als wat x en y al waren meende ik.
code:
1
| int virtualscreen = GetSystemMetrics (SM_CXVIRTUALSCREEN ); |
Geeft heel mooi 2560 aan (2x 1280), maar ja, daar heb ik helaas weinig aan.
Het enige wat ik kan bedenken is om zelf de virtuele desktop te berekenen door alle monitoren te enumereren die actief zijn, en dan met GetMonitorInfo bijvoorbeeld de volgorde te bepalen (via de min/max waardes), en om dan uiteindelijk daarmee de echte virtuele positie te berekenen. Helaas klinkt dit a) omslachtig en b) fout gevoelig.
Dus ik vroeg me af of iemand hier nog suggesties heeft qua API calls misschien? of andere ideeen?