Differenze tra le versioni di "Agire sulla finestra di un qualunque programma"

Da Gambas-it.org - Wikipedia.
 
(9 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Per agire sulla finestra di un programma qualsiasi (anche se non quello dell'applicazione.gambas) bisognerà utilizzare la classe ''DesktopWindow''. Per poter attivare questa Classe si dovrà innanzitutto attivare nel progetto anche il componente ''gb.desktop'', il quale ci consentirà l'uso pure di altre funzioni, come quelle della Classe ''Desktop'', utili al nostro scopo.
+
Per agire sulla finestra di un programma qualsiasi (anche se diverso dall'applicazione.gambas) bisognerà utilizzare la classe ''DesktopWindow''. Per poter attivare questa Classe si dovrà innanzitutto attivare nel progetto anche il componente ''gb.desktop'', il quale ci consentirà l'uso pure di altre funzioni, come quelle della Classe ''Desktop'', utili al nostro scopo.
  
  
==Agire su una finestra di un programma qualsiasi==
+
==Agire sulla finestra di un programma qualsiasi==
Esporremo una possibile modalità di uso della Classe ''DesktopWindow'' e ''Desktop'' pe una ''semplice'' azione su una finestra:
+
Esporremo una possibile modalità di uso della Classe ''DesktopWindow'' e ''Desktop'' per una ''semplice'' azione su una finestra:
 
  '''Public''' Sub Button1_Click()
 
  '''Public''' Sub Button1_Click()
 
   
 
   
  Dim dw As DesktopWindow
+
  Dim dw As DesktopWindow
  Dim a As Integer[]
+
  Dim ii As Integer[]
 
   
 
   
  <FONT color=#006400>' ''Individuiamo il PID della "finestra" del programma:''</font>
+
  <FONT color=#006400>' ''Individuiamo il numero identificativo della "finestra" del programma, inserendo il nome esatto della finestra (si può utilizzare anche l'asterisco "*":''</font>
   a = Desktop.FindWindow("''nome_della_finestra_del_programma_da_gestire''")
+
   ii = Desktop.FindWindow("<FONT color=gray>''nome_della_finestra_del_programma_da_gestire''</font>")
 
   
 
   
   dw = New DesktopWindow(a[0])
+
   With dw = New DesktopWindow(ii[0])
 
    With dw
 
 
  <FONT color=#006400>' ''Ne vediamo il titolo:''</font>
 
  <FONT color=#006400>' ''Ne vediamo il titolo:''</font>
 
  Print .VisibleName
 
  Print .VisibleName
  <FONT color=#006400>' ''Ne vediamo il numero del suo PID in decimale ed in esadecimale:''</font>
+
  <FONT color=#006400>' ''Ne vediamo il numero identificativo in decimale ed in esadecimale:''</font>
 
  Print .Id, hex(.Id)
 
  Print .Id, hex(.Id)
  <FONT color=#006400>' ''Impostiamo i valori dello spostamento, ed eventualmente anche il ridimensionamento della finestra:''
+
  <FONT color=#006400>' ''Impostiamo i valori dello spostamento, ed eventualmente anche il ridimensionamento della finestra (i due parametri relativi al ridimensionamento della finestra sortiscono il loro effetto soltanto se la finestra del programma è ridimensionabile):''</font>
' ''(i due parametri relativi al ridimensionamento della finestra sortiscono il loro effetto soltanto se la finestra del programma è ridimensionabile):''</font>
+
    .Move(<FONT color=gray>''valoreX''</font>, <FONT color=gray>''valoreY''</font>, <FONT color=gray>''valoreW''</font>, <FONT color=gray>''valoreY''</font>)
      .Move(''valoreX'', ''valoreY'', ''valoreW'', ''valoreY'')
+
  End With
    End With
 
 
   
 
   
 
  '''End'''
 
  '''End'''
Riga 29: Riga 26:
  
 
==Agire sulla finestra di un programma qualsiasi operando direttamente con il mouse==
 
==Agire sulla finestra di un programma qualsiasi operando direttamente con il mouse==
In questo caso agiremo sulla finestra di un programma qualsiasi (anche se non quello dell'applicazione.gambas) individuandola con il mouse. Bisognerà fare in modo da sollevare con il mouse la finestra, cliccandoci sopra. Essa, così, diventerà attiva principale rispetto a tutte le altre presenti sul desktop. Quindi, una volta individuata, si operà su di essa attraverso una variabile del tipo della Classe ''DesktopWindow''. Utilizzeremo inoltre un ''Timer'' ponendo un ritardo abbastanza basso, e dovremo attivare il componente ''gb.desktop'':
+
In questo caso agiremo sulla finestra di un programma qualsiasi (anche se non quello dell'applicazione.gambas) individuandola con il mouse. Bisognerà fare in modo da sollevare con il mouse la finestra, cliccandoci sopra. Essa, così, diventerà attiva principale rispetto a tutte le altre presenti sul desktop. Quindi, una volta individuata, si operà su di essa attraverso una variabile del tipo della Classe ''DesktopWindow''. Utilizzeremo inoltre un ''Timer'' ponendo un ritardo abbastanza basso, e dovremo attivare il componente ''gb.desktop''.
 +
 
 +
Attenzione, perché anche il desktop è rappresentato da una finestra; pertanto, se cliccheremo su di esso, comporteremo su questo le modifiche previste dal codice sotto mostrato.
 +
Private Timer1 As Timer
 +
 +
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
 
   
 
   
Riga 37: Riga 39:
 
   Wait 0.1
 
   Wait 0.1
 
   
 
   
   Timer1.Start
+
   With Timer1 = New Timer As "Timer1"
 +
  .Delay = 100
 +
  .Start
 +
  End With
 
   
 
   
 
  '''End'''
 
  '''End'''
Riga 44: Riga 49:
 
  '''Public''' Sub Timer1_Timer()
 
  '''Public''' Sub Timer1_Timer()
 
   
 
   
   Dim a As Integer
+
   Dim i As Integer
 
   Dim dw As DesktopWindow
 
   Dim dw As DesktopWindow
 
   
 
   
 
  <FONT color=#006400>' ''Individuiamo l'handle della finestra attiva in primo piano:''</font>
 
  <FONT color=#006400>' ''Individuiamo l'handle della finestra attiva in primo piano:''</font>
  a = Desktop.ActiveWindow
+
  i = Desktop.ActiveWindow
+
 
<FONT color=#006400>' ''Assegnamo la finestra individuata ad una variabile di tipo della Classe "DesktopWindow"...''</font>
 
  dw = Desktop.Windows.FromHandle(a)
 
 
 
  <FONT color=#006400>' ''...quindi la gestiamo:''</font>
 
  <FONT color=#006400>' ''...quindi la gestiamo:''</font>
    With dw
+
  With dw = New DesktopWindow(i)
Print .VisibleName
+
    Print .VisibleName
Print .Id, hex(.Id)
+
    Print .Id, hex(.Id)
      .Move(Mouse.ScreenX + 10, Mouse.ScreenY)
+
    .Move(Mouse.ScreenX + 20, Mouse.ScreenY)
      .Resize(valoreW, valoreH)
+
    .Resize(200, 100)
<FONT color=#006400>' ''Se cliccheremo su una finestra diversa da quella dell'applicazione principale gambas...''</font>
+
  End With
    If .VisibleName <> Application.Title Then
+
 
<FONT color=#006400>' ''...allora la nuova finestra cliccata sarà anche chiusa dopo 2 secondi:''</font>
 
    Sleep 2
 
      .Close
 
    End With
 
 
 
  '''End'''
 
  '''End'''
  
Riga 75: Riga 72:
 
===Uso del comando ''xprop'' e di ''DesktopWindow''===
 
===Uso del comando ''xprop'' e di ''DesktopWindow''===
 
Vedremo un possibile uso combinato del comando ''xprop'' e della classe ''DesktopWindow'':
 
Vedremo un possibile uso combinato del comando ''xprop'' e della classe ''DesktopWindow'':
  '''Private''' i As Integer
+
  Private i As Integer
 
   
 
   
 
   
 
   
 
  '''Public''' Sub Form_Open()   
 
  '''Public''' Sub Form_Open()   
 
    
 
    
Dim pr As Process   
+
  Dim pr As Process   
Dim ss, x As New String[]   
+
  Dim ss, x As New String[]   
Dim s, y As String   
+
  Dim s, y As String
    
+
   
  pr = Shell "xprop | grep '(WINDOW):'" For Read
+
   pr = Shell "xprop | grep '(WINDOW):'" For Read  
 
 
 
    
 
    
 
   While Not Eof(pr)   
 
   While Not Eof(pr)   
     Input #pr, s
+
     Input #pr, s  
     ss.Add(s)
+
     ss.Add(s)
   Wend
+
   Wend
 
 
 
    
 
    
  <FONT color=#006400>' ''Dividiamo la stringa contenente il primo valore esadecimale,''
+
  <FONT color=#006400>' ''Dividiamo la stringa contenente il primo valore esadecimale, in modo tale da ottenere la seconda parte utile, priva di “0x”:''</font>
' ''in modo tale da ottenere la seconda parte utile, priva di “0x”:''</font>
+
  x = Split(ss[4], "x")
    x = Split(ss[4], "x")
+
  <FONT color=#006400>' ''Dividiamo la stringa contenente il secondo valore esadecimale, in modo tale da ottenere le ultime due cifre più a destra:''</font>
  <FONT color=#006400>' ''Dividiamo la stringa contenente il secondo valore esadecimale,''
+
  y = Right(ss[9], 2)   
' ''in modo tale da ottenere le ultime due cifre più a destra:''</font>
 
    y = Right(ss[9], 2)   
 
 
  <FONT color=#006400>' ''Individua il valore esadecimale preciso della finestra, lo trasforma in decimale:''</font>
 
  <FONT color=#006400>' ''Individua il valore esadecimale preciso della finestra, lo trasforma in decimale:''</font>
    i = Val("&" & x[1]) - Val("&" & y)   
+
  i = Val("&" & x[1]) - Val("&" & y)   
 
    
 
    
 
  '''End'''
 
  '''End'''
 
+
 
 
 
  '''Public''' Sub Button1_Click()   
 
  '''Public''' Sub Button1_Click()   
 
    
 
    
Dim dw As DesktopWindow   
+
  Dim dw As DesktopWindow   
 
    
 
    
    
+
   dw = New DesktopWindow(i)
  dw = New DesktopWindow(i)
 
 
   
 
   
    With dw
+
  With dw
 
  Print .VisibleName
 
  Print .VisibleName
 
  Print .Id, hex(.Id)
 
  Print .Id, hex(.Id)
      .Move(Mouse.ScreenX + 10, Mouse.ScreenY)
+
    .Move(Mouse.ScreenX + 10, Mouse.ScreenY)
    End With
+
  End With
 
    
 
    
 
  '''End'''
 
  '''End'''
 
Il puntatore del mouse muterà a forma di crocetta. Si dovrà cliccare una volta sulla finestra interessata. Quindi cliccando successivamente sul Button1, la finestra si sposta alle coordinate X ed Y stabilite. Potrà anche essere previsto il ridimensionamento della finestra ponendo anche i valori relativi a ''Weigth'' e ''Width'': ''.Move(x, y, w, h).
 
Il puntatore del mouse muterà a forma di crocetta. Si dovrà cliccare una volta sulla finestra interessata. Quindi cliccando successivamente sul Button1, la finestra si sposta alle coordinate X ed Y stabilite. Potrà anche essere previsto il ridimensionamento della finestra ponendo anche i valori relativi a ''Weigth'' e ''Width'': ''.Move(x, y, w, h).
 
  
  

Versione attuale delle 13:00, 20 ago 2022

Per agire sulla finestra di un programma qualsiasi (anche se diverso dall'applicazione.gambas) bisognerà utilizzare la classe DesktopWindow. Per poter attivare questa Classe si dovrà innanzitutto attivare nel progetto anche il componente gb.desktop, il quale ci consentirà l'uso pure di altre funzioni, come quelle della Classe Desktop, utili al nostro scopo.


Agire sulla finestra di un programma qualsiasi

Esporremo una possibile modalità di uso della Classe DesktopWindow e Desktop per una semplice azione su una finestra:

Public Sub Button1_Click()

  Dim dw As DesktopWindow
  Dim ii As Integer[]

' Individuiamo il numero identificativo della "finestra" del programma, inserendo il nome esatto della finestra (si può utilizzare anche l'asterisco "*":
  ii = Desktop.FindWindow("nome_della_finestra_del_programma_da_gestire")

  With dw = New DesktopWindow(ii[0])
' Ne vediamo il titolo:
Print .VisibleName
' Ne vediamo il numero identificativo in decimale ed in esadecimale:
Print .Id, hex(.Id)
' Impostiamo i valori dello spostamento, ed eventualmente anche il ridimensionamento della finestra (i due parametri relativi al ridimensionamento della finestra sortiscono il loro effetto soltanto se la finestra del programma è ridimensionabile):
   .Move(valoreX, valoreY, valoreW, valoreY)
 End With

End

E' ovviamente possibile utilizzare anche le altre funzioni e proprietà disponibili per la Classe DesktopWindow.


Agire sulla finestra di un programma qualsiasi operando direttamente con il mouse

In questo caso agiremo sulla finestra di un programma qualsiasi (anche se non quello dell'applicazione.gambas) individuandola con il mouse. Bisognerà fare in modo da sollevare con il mouse la finestra, cliccandoci sopra. Essa, così, diventerà attiva principale rispetto a tutte le altre presenti sul desktop. Quindi, una volta individuata, si operà su di essa attraverso una variabile del tipo della Classe DesktopWindow. Utilizzeremo inoltre un Timer ponendo un ritardo abbastanza basso, e dovremo attivare il componente gb.desktop.

Attenzione, perché anche il desktop è rappresentato da una finestra; pertanto, se cliccheremo su di esso, comporteremo su questo le modifiche previste dal codice sotto mostrato.

Private Timer1 As Timer


Public Sub Form_Open()

 Me.Center
 Me.show

 Wait 0.1

 With Timer1 = New Timer As "Timer1"
  .Delay = 100
  .Start
 End With

End


Public Sub Timer1_Timer()

 Dim i As Integer
 Dim dw As DesktopWindow

' Individuiamo l'handle della finestra attiva in primo piano:
 i = Desktop.ActiveWindow
 
' ...quindi la gestiamo:
 With dw  = New DesktopWindow(i)
   Print .VisibleName
   Print .Id, hex(.Id)
   .Move(Mouse.ScreenX + 20, Mouse.ScreenY)
   .Resize(200, 100)
 End With
 
End


Agire su una finestra anche con comandi bash

E' possibile utilizzare congiuntamente comandi bash specifici e la Classe DesktopWindow

Uso del comando xprop e di DesktopWindow

Vedremo un possibile uso combinato del comando xprop e della classe DesktopWindow:

Private i As Integer


Public Sub Form_Open()  
 
 Dim pr As Process  
 Dim ss, x As New String[]  
 Dim s, y As String  

 pr = Shell "xprop | grep '(WINDOW):'" For Read   
 
 While Not Eof(pr)  
   Input #pr, s 
   ss.Add(s)
 Wend
  
' Dividiamo la stringa contenente il primo valore esadecimale, in modo tale da ottenere la seconda parte utile, priva di “0x”:
 x = Split(ss[4], "x")
' Dividiamo la stringa contenente il secondo valore esadecimale, in modo tale da ottenere le ultime due cifre più a destra:
 y = Right(ss[9], 2)  
' Individua il valore esadecimale preciso della finestra, lo trasforma in decimale:
 i = Val("&" & x[1]) - Val("&" & y)  
  
End

Public Sub Button1_Click()  
 
 Dim dw As DesktopWindow  
 
 dw = New DesktopWindow(i)

 With dw
Print .VisibleName
Print .Id, hex(.Id)
   .Move(Mouse.ScreenX + 10, Mouse.ScreenY)
 End With
 
End

Il puntatore del mouse muterà a forma di crocetta. Si dovrà cliccare una volta sulla finestra interessata. Quindi cliccando successivamente sul Button1, la finestra si sposta alle coordinate X ed Y stabilite. Potrà anche essere previsto il ridimensionamento della finestra ponendo anche i valori relativi a Weigth e Width: .Move(x, y, w, h).


Uso del programma wmctrl con Shell

Si potrà fare anche uso del comando wmctrl lanciato con Shell:

Public Sub Button1_Click()  
     
' La finestra del programma, in questo esempio, viene posta in basso al centro dello schermo:
  Shell "wmctrl -r nome_della_finestra_del_programma -e 0,500,800,600,300"
     
End

riguardo ai valori inseriti dell'esempio precedente:

  • 500 = coordinate x;
  • 800 = coordinate y;
  • 600 = lunghezza della finestra;
  • 300 = altezza della finestra.

Quindi, volendo, è possibile anche far modificare la grandezza della finestra; altrimenti i due ultimi parametri dovrebbero essere posti a -1.