Page 1 of 2
					
				Open Window on Second Desktop
				Posted: Mon Jun 15, 2015 6:26 pm
				by Chuf
				Hello
I'm looking for a way to open a window on a second monitor, I have found a solution even in the English forum but only for OSX have modifies the code and post the times here, perhaps someone knows how to do that under Windows or even better, as cross-platform solution
many Greetings
Code: Select all
mainWindow = OpenWindow(0,50,50,300,300,"Main Window",#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget|#PB_Window_SystemMenu)
ButtonGadget(1,10,10,250,50,"2nd Window ON/OFF")
ButtonGadget(2,10,60,250,50,"Send Message to 2nd Window")    
 If mainWindow   
    Repeat
      Event = WaitWindowEvent()
     
     Select Event
     
       Case #PB_Event_Gadget
         
         Select EventGadget()
          Case 1 
            If externalWindow = 1
              externalWindow = 0
              CloseWindow(AppWindow)
            Else
              ScreenArray = CocoaMessage(0, 0, "NSScreen screens")
              If CocoaMessage(0, ScreenArray, "count") < 2
                Debug "No second screen"
              Else
                externalWindow = 1
                CocoaMessage(@Frame.NSRect, CocoaMessage(0, ScreenArray, "objectAtIndex:", 1), "visibleFrame")
                AppWindow = OpenWindow(#PB_Any, 0, 0, 0, 0, "Second screen window", #PB_Window_BorderLess )
                TextGadget(21, 10, 10, 250, 50, "2nd Windows")              
                CocoaMessage(0, WindowID(AppWindow), "setFrame:@", @Frame, "display:", #YES)    
              EndIf  
            EndIf
          Case 2
              If externalWindow = 1
                SetGadgetText(21, "##### OK ####") ; sen a message to 2nd Monitor  
              EndIf
       EndSelect
       
     EndSelect
    Until Event = #PB_Event_CloseWindow
 EndIf
 
			 
			
					
				Re: Open Window on Second Desktop
				Posted: Mon Jun 15, 2015 6:29 pm
				by Julian
				PureBasic - Desktop
Overview
The desktop library allows access to information about the user's desktop environment, such as screen width, height, depth, mouse position etc.
Desktop Manual
Desktop Example 
			 
			
					
				Re: Open Window on Second Desktop
				Posted: Mon Jun 15, 2015 6:37 pm
				by Chuf
				i found not a way to send or open a window direct on the 2nd Desktop
			 
			
					
				Re: Open Window on Second Desktop
				Posted: Mon Jun 15, 2015 6:58 pm
				by kenmo
				Quick example:
Code: Select all
mainWindow = OpenWindow(0,50,50,300,300,"Main Window",#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget|#PB_Window_SystemMenu)
ButtonGadget(1,10,10,250,50,"2nd Window ON/OFF")
ButtonGadget(2,10,60,250,50,"Send Message to 2nd Window")   
 If mainWindow   
    Repeat
      Event = WaitWindowEvent()
     
     Select Event
     
       Case #PB_Event_Gadget
         
         Select EventGadget()
          Case 1
            If externalWindow = 1
              externalWindow = 0
              CloseWindow(AppWindow)
            Else
              If ExamineDesktops() < 2
                Debug "No second screen"
              Else
                externalWindow = 1
                AppWindow = OpenWindow(#PB_Any, 0, 0, WindowWidth(0), WindowWidth(0), "Second screen window", #PB_Window_BorderLess )
                TextGadget(21, 10, 10, 250, 50, "2nd Windows")
                
                ; top-left of 2nd desktop
                ;ResizeWindow(AppWindow, DesktopX(1), DesktopY(1), #PB_Ignore, #PB_Ignore)
                
                ; center on 2nd desktop
                ResizeWindow(AppWindow, DesktopX(1) + (DesktopWidth(1) - WindowWidth(AppWindow))/2, DesktopY(1) + (DesktopHeight(1) - WindowHeight(AppWindow))/2, #PB_Ignore, #PB_Ignore)
                
                HideWindow(AppWindow, #False)
              EndIf 
            EndIf
          Case 2
              If externalWindow = 1
                SetGadgetText(21, "##### OK ####") ; sen a message to 2nd Monitor 
              EndIf
       EndSelect
       
     EndSelect
    Until Event = #PB_Event_CloseWindow
 EndIf
 
			 
			
					
				Re: Open Window on Second Desktop
				Posted: Mon Jun 15, 2015 7:04 pm
				by TI-994A
				Hi Chuf, and welcome to the PureBasic forum.    
 
Chuf wrote:i found not a way to send or open a window direct on the 2nd Desktop
Try this:
Code: Select all
ExamineDesktops()
d2x = DesktopWidth(1)
OpenWindow(0, d2x + 100, 100, 400, 300, "Multiple Desktops", #PB_Window_SystemMenu)
While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend
Hope it helps.
 
			 
			
					
				Re: Open Window on Second Desktop
				Posted: Mon Jun 15, 2015 7:07 pm
				by freak
				TI-994A wrote:Try this:
Code: Select all
ExamineDesktops()
d2x = DesktopWidth(1)
OpenWindow(0, d2x + 100, 100, 400, 300, "Multiple Desktops", #PB_Window_SystemMenu)
While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend
Hope it helps.
 
This assumes that the 2nd Monitor is to the left of the 1st one, which may not always be the case. Better use DesktopX() and DesktopY() to get the right position.
 
			 
			
					
				Re: Open Window on Second Desktop
				Posted: Mon Jun 15, 2015 7:12 pm
				by infratec
				Hi,
my untested version:
Code: Select all
EnableExplicit
Structure DesktopStructure
  No.i
  X.i
  Y.i
  Width.i
  Height.i
  Name$
EndStructure
Procedure MoveWindowToDesktop(Window.i, Desktop.i, x.i, y.i, List DesktopList.DesktopStructure(), Flags.i=0)
  
  If IsWindow(Window)
    
    If SelectElement(DesktopList(), Desktop)
      
      If Flags = #PB_Window_ScreenCentered
        x = (DesktopList()\Width - WindowWidth(Window)) / 2
        y = (DesktopList()\Height - WindowHeight(Window)) / 2
      EndIf
      
      ResizeWindow(Window, DesktopList()\X + x, DesktopList()\Y + y, #PB_Ignore, #PB_Ignore)
      
    EndIf
    
  EndIf
  
EndProcedure
Define.i Desktops, i
NewList DesktopList.DesktopStructure()
Desktops = ExamineDesktops() - 1
For i = 0 To Desktops
  AddElement(DesktopList())
  DesktopList()\No = i
  DesktopList()\X = DesktopX(i)
  DesktopList()\Y = DesktopY(i)
  DesktopList()\Width = DesktopWidth(i)
  DesktopList()\Height = DesktopHeight(i)
  DesktopList()\Name$ = DesktopName(i)
  ;Debug DesktopList()\Name$
Next i
OpenWindow(0, 0, 0, 400, 300, "Test", #PB_Window_SystemMenu)
MoveWindowToDesktop(0, 0, 0, 0, DesktopList(), #PB_Window_ScreenCentered)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
At home I have only one monitor  
 
You not really need the list, you can also get the values of the specified desktop inside the procedure.
Bernd
 
			 
			
					
				Re: Open Window on Second Desktop
				Posted: Mon Jun 15, 2015 7:30 pm
				by TI-994A
				freak wrote:Better use DesktopX() and DesktopY() to get the right position.
Quite right; thank you.
This example will open a window on each desktop, identifying them in the title:
Code: Select all
desktops = ExamineDesktops()
For i = 0 To desktops - 1
  OpenWindow(i, DesktopX(i) + 100, DesktopY(i) + 100, 
             400, 300, "Desktop #" + Str(i), #PB_Window_SystemMenu)
Next i
While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend
Good to know which is which.    

 
			 
			
					
				Re: Open Window on Second Desktop
				Posted: Mon Jun 15, 2015 7:45 pm
				by Chuf
				many Thanks, the best solution is from kenmo 
many many Thanks!!
			 
			
					
				Re: Open Window on Second Desktop
				Posted: Wed Jun 17, 2015 9:35 am
				by infratec
				Only for completeness:
the version without a list.
Code: Select all
Procedure MoveWindowToDesktop(Window.i, Desktop.i, x.i, y.i, Flags.i=0)
  
  If IsWindow(Window)
  
    If ExamineDesktops() > Desktop
      
      If Flags = #PB_Window_ScreenCentered
        x = (DesktopWidth(Desktop) - WindowWidth(Window)) / 2
        y = (DesktopHeight(Desktop) - WindowHeight(Window)) / 2
      EndIf
      
      ResizeWindow(Window, DesktopX(Desktop) + x, DesktopY(Desktop) + y, #PB_Ignore, #PB_Ignore)
      
    EndIf
    
  EndIf
  
EndProcedure
OpenWindow(0, 0, 0, 400, 300, "Test", #PB_Window_SystemMenu)
;MoveWindowToDesktop(0, 1, 0, 0, #PB_Window_ScreenCentered)
MoveWindowToDesktop(0, 1, 10, 10)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Now tested with 2 monitors   
 
Bernd
 
			 
			
					
				Re: Open Window on Second Desktop
				Posted: Thu Jun 18, 2015 9:59 pm
				by Chuf
				Hi Bernd, have you testet the Programm by OS X or Windows?
			 
			
					
				Re: Open Window on Second Desktop
				Posted: Fri Jun 19, 2015 7:03 am
				by infratec
				Hi,
tested on windows.
But since it doesn't use any API it should also work on OSX.
I can test it only on a MacBook, but without a second screen  
 
Bernd
 
			 
			
					
				Re: Open Window on Second Desktop
				Posted: Fri Jun 19, 2015 3:00 pm
				by TI-994A
				infratec wrote:...it should also work on OSX.
Hi Bernd. Just tested it with PureBasic v5.31 on OSX Mavericks, and it works perfectly with two screens, 
with and without centering.    

 
			 
			
					
				Re: Open Window on Second Desktop
				Posted: Fri Jun 26, 2015 9:40 pm
				by Chuf
				Hi Bernd, this code run not correct by div. resolution 
my second monitor has 1920x1200
my 2nd has 800x600
the 2nd window is to big for the 2nd monitor
			 
			
					
				Re: Open Window on Second Desktop
				Posted: Fri Jun 26, 2015 10:00 pm
				by Chuf
				sorry my error i´m search for a fullscreen solution for the 2nd monitor your code is OK i´m edit your code for fullscreen
Code: Select all
Procedure MoveWindowToDesktop(Window.i, Desktop.i, x.i, y.i, Flags.i)
  
  If IsWindow(Window)
  
    If ExamineDesktops() > Desktop
;       If Flags = #PB_Window_ScreenCentered
;         x = (DesktopWidth(Desktop) - WindowWidth(Window)) / 2
;         y = (DesktopHeight(Desktop) - WindowHeight(Window)) / 2
;       EndIf
      ;ResizeWindow(Window, DesktopX(Desktop) + x, DesktopY(Desktop) + y, #PB_Ignore, #PB_Ignore)
      ResizeWindow(Window, DesktopX(Desktop), DesktopY(Desktop),DesktopWidth(Desktop),DesktopHeight(Desktop))
      
    EndIf
    
  EndIf
  
EndProcedure