FW_GetMonitor() doesn't work
- nageswaragunupudi
- Posts: 8017
- Joined: Sun Nov 19, 2006 5:22 am
- Location: India
- Contact:
Re: FW_GetMonitor() doesn't work
Mr. Frose
Nice approach
We will adopt that with very minor modifications.
We will post the revised code here for your testing
Nice approach
We will adopt that with very minor modifications.
We will post the revised code here for your testing
Regards
G. N. Rao.
Hyderabad, India
G. N. Rao.
Hyderabad, India
Re: FW_GetMonitor() doesn't work
yes the function should be independent of the display settings.
There is still a little drawback: the monitor numbers are normally not synchronous with the numbers in the Windows display settings, but for my needs this is not critical.
There is still a little drawback: the monitor numbers are normally not synchronous with the numbers in the Windows display settings, but for my needs this is not critical.
Re: FW_GetMonitor() doesn't work
OkWe will post the revised code here for your testing
- nageswaragunupudi
- Posts: 8017
- Joined: Sun Nov 19, 2006 5:22 am
- Location: India
- Contact:
Re: FW_GetMonitor() doesn't work
Code: Select all
function FW_GetMonitor( nRow, nCol ) // POINT r,c [OR] nMonitor, [or] oWnd/hWnd No params: primary monitor
local aInfo, oMonitor, x, y, nMonitor, nMax, hWnd, aRect
if nRow == nil .and. nCol == nil
oMonitor := TMonitor():New( MonitorInfoFromRC( 20, 20 ) )
elseif HB_ISNUMERIC( nRow ) .and. HB_ISNUMERIC( nCol )
aInfo := MonitorInfoFromRC( nRow, nCol )
if !Empty( aInfo )
oMonitor := TMonitor():New( aInfo )
endif
elseif PCount() == 1
if HB_ISOBJECT( nRow ) .and. nRow:IsKindOf( "TWINDOW" )
nRow := nRow:hWnd
endif
if ValType( nRow ) != "N"
nRow := 1
endif
if IsWindow( nRow )
aInfo := MonitorInfoFromRC( nRow )
if aInfo != nil
oMonitor := TMonitor():New( aInfo )
endif
else
nMax := Max( 1, Min( nRow, FW_ActiveMonitors() ) )
aRect := FW_VirtualScreen()
x := aRect[ 2 ] + 100
for nMonitor := 1 to nMax
for y := aRect[ 1 ] + 100 to aRect[ 3 ] step 100
aInfo := MonitorInfoFromRC( y, x )
if !Empty( aInfo )
EXIT
endif
next
if Empty( aInfo ) // should not happen
return nil
endif
x := aInfo[ 4 ] + 100
next nMonitor
oMonitor := TMonitor():New( aInfo )
endif
endif
return oMonitor
Can you please check the revised function with your 3 monitors arranged in different arrangements?
And can you also check this new function?
Code: Select all
function FW_GetAllMonitors()
local aMonitors := {}
local aRect, x, y, aInfo, nMonitors, nMonitor
nMonitors := FW_ActiveMonitors()
aRect := FW_VirtualScreen()
x := aRect[ 2 ] + 100
do while x < aRect[ 4 ]
aInfo := nil
for y := aRect[ 1 ] + 100 to aRect[ 3 ] step 100
aInfo := MonitorInfoFromRC( y, x )
if !Empty( aInfo )
EXIT
endif
next
if Empty( aInfo )
EXIT
endif
AAdd( aMonitors, TMonitor():New( aInfo ) )
x := aInfo[ 4 ] + 100
enddo
return aMonitors
Regards
G. N. Rao.
Hyderabad, India
G. N. Rao.
Hyderabad, India
Re: FW_GetMonitor() doesn't work
Good afternoon Mr. Rao,
thank god it's friday
For a 'linear' setup 1-2-3 its working:
But not for a non linear setup, e. g. 1-3-2:
- FW_GetMonitor( 1 ) is ok
- FW_GetMonitor( 2 ) returns the coordinates of display 3!
- FW_GetMonitor( 3 ) returns NIL even though FW_ActiveMonitors() returns 3
- Consequentially FW_GetAllMonitors() returns an array with the dimension 2, the coordinates of display 1 and 3
Some other questions and wishes:
- Nothing found about oMonitor:lWinRect, what is the purpose of it?
- What is the aim of oMonitor:cRect? Do you want to fill it with ArraysString( aRect ), I would appreciate it
- It would be helpful to integrate the Array rcWork in the class TMonitor, to get the information where the task bar(s) are nested
Best regards and until later
Frank
thank god it's friday
For a 'linear' setup 1-2-3 its working:
But not for a non linear setup, e. g. 1-3-2:
- FW_GetMonitor( 1 ) is ok
- FW_GetMonitor( 2 ) returns the coordinates of display 3!
- FW_GetMonitor( 3 ) returns NIL even though FW_ActiveMonitors() returns 3
- Consequentially FW_GetAllMonitors() returns an array with the dimension 2, the coordinates of display 1 and 3
Some other questions and wishes:
- Nothing found about oMonitor:lWinRect, what is the purpose of it?
- What is the aim of oMonitor:cRect? Do you want to fill it with ArraysString( aRect ), I would appreciate it
- It would be helpful to integrate the Array rcWork in the class TMonitor, to get the information where the task bar(s) are nested
Best regards and until later
Frank
- nageswaragunupudi
- Posts: 8017
- Joined: Sun Nov 19, 2006 5:22 am
- Location: India
- Contact:
Re: FW_GetMonitor() doesn't work
Mr. Frank
Thank you very much.
I am able to test with 2 monitors only. I do need your help.
I guess your function should be working correctly in case if the 2nd setup 1-3-2.
What are the 3 Rects you are getting with your function?
Now that you understood the logic fully, can you help to correct the logic in my function?
Today is Friday. May I know when will you be resuming work and be able to help me?
DATA lWinRect is .T. by default.
When this is .T., the calculations of width and height adopt Windows' logic which is relevant to us.
height = bottom - top and width = right - left.
When .F., the calculations are normal, i.e.,
height = botton - top + 1 and width = right - left + 1.
For our purpose, we should not disturb this data.
This is not of use in application programs.
Thanking you for your help and also expecting more help from you before release of FWH1901
Thank you very much.
I am able to test with 2 monitors only. I do need your help.
I guess your function should be working correctly in case if the 2nd setup 1-3-2.
What are the 3 Rects you are getting with your function?
Now that you understood the logic fully, can you help to correct the logic in my function?
Today is Friday. May I know when will you be resuming work and be able to help me?
This is data inherited from base class TRect.- Nothing found about oMonitor:lWinRect, what is the purpose of it?
DATA lWinRect is .T. by default.
When this is .T., the calculations of width and height adopt Windows' logic which is relevant to us.
height = bottom - top and width = right - left.
When .F., the calculations are normal, i.e.,
height = botton - top + 1 and width = right - left + 1.
For our purpose, we should not disturb this data.
cRect is formatted like C Language RECT struct to be directly used with Windows API functions.- What is the aim of oMonitor:cRect? Do you want to fill it with ArraysString( aRect ), I would appreciate it
This is not of use in application programs.
Keeping it as a TRect object has more advanatages as you may notice in due course.- It would be helpful to integrate the Array rcWork in the class TMonitor, to get the information where the task bar(s) are nested
Thanking you for your help and also expecting more help from you before release of FWH1901
Regards
G. N. Rao.
Hyderabad, India
G. N. Rao.
Hyderabad, India
- Silvio.Falconi
- Posts: 4956
- Joined: Thu Oct 18, 2012 7:17 pm
Re: FW_GetMonitor() doesn't work
Why I not have this functions?
I wish try the test also I...
Turbo Incremental Link 6.70 Copyright (c) 1997-2014 Embarcadero Technologies, Inc.
Error: Unresolved external '_HB_FUN_TMONITOR' referenced from C:\WORK\ERRORI\MONITORS\OBJ\TEST.OBJ
Error: Unresolved external '_HB_FUN_MONITORINFOFROMRC' referenced from C:\WORK\ERRORI\MONITORS\OBJ\TEST.OBJ
Warning: Public symbol '_HB_FUN_FW_GETMONITOR' defined in both module C:\WORK\ERRORI\MONITORS\OBJ\TEST.OBJ and C:\WORK\ERRORI\MONITORS\OBJ\GETSYSIN.OBJ
Error: Unable to perform link
I wish try the test also I...
Turbo Incremental Link 6.70 Copyright (c) 1997-2014 Embarcadero Technologies, Inc.
Error: Unresolved external '_HB_FUN_TMONITOR' referenced from C:\WORK\ERRORI\MONITORS\OBJ\TEST.OBJ
Error: Unresolved external '_HB_FUN_MONITORINFOFROMRC' referenced from C:\WORK\ERRORI\MONITORS\OBJ\TEST.OBJ
Warning: Public symbol '_HB_FUN_FW_GETMONITOR' defined in both module C:\WORK\ERRORI\MONITORS\OBJ\TEST.OBJ and C:\WORK\ERRORI\MONITORS\OBJ\GETSYSIN.OBJ
Error: Unable to perform link
I use : FiveWin for Harbour August 2020 (Revision) - Harbour 3.2.0dev (r1712141320) - Bcc7.30 - xMate ver. 1.15.3 - PellesC
- nageswaragunupudi
- Posts: 8017
- Joined: Sun Nov 19, 2006 5:22 am
- Location: India
- Contact:
Re: FW_GetMonitor() doesn't work
You have all these functions in FWH1812
Regards
G. N. Rao.
Hyderabad, India
G. N. Rao.
Hyderabad, India
- Silvio.Falconi
- Posts: 4956
- Joined: Thu Oct 18, 2012 7:17 pm
Re: FW_GetMonitor() doesn't work
strange make error
I use : FiveWin for Harbour August 2020 (Revision) - Harbour 3.2.0dev (r1712141320) - Bcc7.30 - xMate ver. 1.15.3 - PellesC
Re: FW_GetMonitor() doesn't work
Good morning Mr. Rao,
IMHO you have _ the complete virtual screen, because the user can arrange the displays in all different order and obviously the original code 'caughts' a point with isn't within the virtual screen , so the loop ends with an exit, before all monitors are scanned. Nevertheless the following code works for me:
For FW_GetMonitor( nMonitor) I have a pragmatically but workable solution, that's the main thing :
Thank you for the other informations regarding oMonitor:lWinRect.
Best regards and a nice weekend
Frank
post scriptum: If I find the time, I will test the functions with 4 displays in a very strange order later this WE, I'll give you an info about the results
IMHO you have _ the complete virtual screen, because the user can arrange the displays in all different order and obviously the original code 'caughts' a point with isn't within the virtual screen , so the loop ends with an exit, before all monitors are scanned. Nevertheless the following code works for me:
Code: Select all
function FW_GetAllMonitors()
local aMonitors := {}
local aRect, nRow, nCol, aInfo, caInfo, nMonitors, nMonitor := 0
nMonitors := FW_ActiveMonitors()
aRect := FW_VirtualScreen()
for nRow := aRect[ 1 ] + 100 to aRect[ 3 ] step 100
for nCol := aRect[ 2 ] + 100 to aRect[ 4 ] step 100
aInfo := MonitorInfoFromRC( nRow, nCol )
IF HB_IsArray( aInfo )
caInfo := Str( aInfo[ 1 ] ) + ", " + Str( aInfo[ 2 ] ) + ", " + Str( aInfo[ 3 ] ) + ", " + Str( aInfo[ 4 ] )
IF AScan( aMonitors, { | x | x[ 2 ] == caInfo } ) == 0
nMonitor ++
AAdd( aMonitors, { nMonitor, caInfo, aInfo, TMonitor():New( aInfo ) } )
ENDIF
ENDIF
IF nMonitor >= nMonitors
EXIT
ENDIF
next nCol
IF nMonitor >= nMonitors
EXIT
ENDIF
next nRow
return aMonitors
Code: Select all
STATIC aMonitors_static
function FW_GetMonitor( nRow, nCol ) // POINT r,c [OR] nMonitor, [or] oWnd/hWnd No params: primary monitor
...
else
IF HB_IsNIL( aMonitors_static )
aMonitors_static := FW_GetAllMonitors()
ENDIF
oMonitor := aMonitors_static[ nRow, 4 ]
endif
...
return oMonitor
They are the direct returns from MonitorInfoFromRC(), I have integrated them in the aMonitors[ 3 ] == aInfoWhat are the 3 Rects you are getting with your function?
Ok, put it in aMonitors[ 2 ] == caInfocRect is formatted like C Language RECT struct to be directly used with Windows API functions.
This is not of use in application programs.
Best regards and a nice weekend
Frank
post scriptum: If I find the time, I will test the functions with 4 displays in a very strange order later this WE, I'll give you an info about the results
Re: FW_GetMonitor() doesn't work
I wrote:
Ooops, promised too much, even I can connect 4 monitors to my Thunderbolt Dock TB16, only 3 monitors were supported simultaneously. When I extend desktop to the fourth monitor the other one (connected via display port) switch off and vice versa.post scriptum: If I find the time, I will test the functions with 4 displays in a very strange order later this WE, I'll give you an info about the results