Differenze tra le versioni di "Individuare ed estrarre l'ID della finestra di un programma"

Da Gambas-it.org - Wikipedia.
 
(19 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Vi sono diverse modalità per trovare il numero identificativo ('''''ID''''') della finestra di un'applicazione.
+
Vi sono diverse modalità per trovare il numero identificativo ('''ID''') della finestra di un'applicazione.
  
  
Riga 13: Riga 13:
 
===Uso della Classe <FONT color="red">''FMain''</font> o la parola <FONT color="red">''Me''</font>===
 
===Uso della Classe <FONT color="red">''FMain''</font> o la parola <FONT color="red">''Me''</font>===
 
L'uso della Classe ''FMain'' o della parola ''Me'' è senz'altro il metodo più veloce per conoscere l'ID della finestra del programma principale:
 
L'uso della Classe ''FMain'' o della parola ''Me'' è senz'altro il metodo più veloce per conoscere l'ID della finestra del programma principale:
  '''Public''' Sub Button2_Click()
+
  Public Sub Button2_Click()
 
   
 
   
  With FMain
+
  With FMain
 
  <font color="#006400">' ''L'ID della "finestra" del programma principale viene mostrato in decimale ed in esadecimale:''</font>
 
  <font color="#006400">' ''L'ID della "finestra" del programma principale viene mostrato in decimale ed in esadecimale:''</font>
    Print .Id, Hex(.Id)
+
    Print .Id, Hex(.Id)
  End With
+
  End With
 
   
 
   
  '''End'''
+
  End
  
  
 
===Uso della funzione <i>ActiveWindow</i> della Classe <FONT color="red">''Application''</font>===
 
===Uso della funzione <i>ActiveWindow</i> della Classe <FONT color="red">''Application''</font>===
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
 
   Dim w As Window
 
   Dim w As Window
 
   
 
   
  w = Application.ActiveWindow
+
  w = Application.ActiveWindow
 
   
 
   
  Print w.Id, hex(w.Id)
+
  Print w.Id, hex(w.Id)
+
 
  '''End'''
+
  End
 
o più velocemente:
 
o più velocemente:
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
  Print Application.ActiveWindow.Id
+
  Print Application.ActiveWindow.Id
 
   
 
   
  '''End'''
+
  End
  
  
 
==Individuare l'ID della finestra che contiene un Controllo==
 
==Individuare l'ID della finestra che contiene un Controllo==
 
Per individuare l'ID della finestra che contiene un Controllo, possiamo usare la proprietà <FONT color="red"><i>Window</i></font> del Controllo medesimo.
 
Per individuare l'ID della finestra che contiene un Controllo, possiamo usare la proprietà <FONT color="red"><i>Window</i></font> del Controllo medesimo.
 
  
 
Poniamo per esempio di avere un applicativo con due <i>Form</i>: uno principale (<i>FMain</i>) ed uno secondario (<i>Form1</i>). Sul <i>Form</i> secondario, <i>Form1</i>, è posto un <i>Button</i>. Supponiamo di voler individuare l'ID della finestra del Form secondario, ove è posto il <i>Button</i>, al fine di conoscere il nome della finestra e di gestirla. Nel codice della Classe, alla quale appartiene il Form secondario, avremo:
 
Poniamo per esempio di avere un applicativo con due <i>Form</i>: uno principale (<i>FMain</i>) ed uno secondario (<i>Form1</i>). Sul <i>Form</i> secondario, <i>Form1</i>, è posto un <i>Button</i>. Supponiamo di voler individuare l'ID della finestra del Form secondario, ove è posto il <i>Button</i>, al fine di conoscere il nome della finestra e di gestirla. Nel codice della Classe, alla quale appartiene il Form secondario, avremo:
  <b>Public</b> Sub aperturaFormSecondario()
+
  Public Sub aperturaFormSecondario()
 
   
 
   
 
   Form1.Show()
 
   Form1.Show()
Riga 54: Riga 53:
 
     Print Hex(.Id), .Name
 
     Print Hex(.Id), .Name
 
  <font color="#006400">' <i>...inoltre, la spostiamo e la ridimensioniamo:</i></font>
 
  <font color="#006400">' <i>...inoltre, la spostiamo e la ridimensioniamo:</i></font>
     . Move(200, 500, 50, 300)
+
     .Move(200, 500, 50, 300)
 
   End With
 
   End With
 
   
 
   
  '''End'''
+
  End
  
  
Riga 66: Riga 65:
 
===Individuare l'ID di tutte le finestre aperte nella scrivania===
 
===Individuare l'ID di tutte le finestre aperte nella scrivania===
 
Se si intende individuare e raccogliere l'ID di tutte le finestre aperte in quel momento sulla scrivania, si potrà procedere con il seguente algoritmo:
 
Se si intende individuare e raccogliere l'ID di tutte le finestre aperte in quel momento sulla scrivania, si potrà procedere con il seguente algoritmo:
  <b>Public</b> Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
 
   Dim i As Integer
 
   Dim i As Integer
Riga 72: Riga 71:
 
   
 
   
 
  <font color="#006400">' <i>Otteniamo gli ID di tutte le "finestre" aperte sulla scrivania:</i></font>
 
  <font color="#006400">' <i>Otteniamo gli ID di tutte le "finestre" aperte sulla scrivania:</i></font>
  For Each i In Desktop.FindWindow("")
+
  For Each i In Desktop.FindWindow(Null, Null, Null)
+
    With dw = New DesktopWindow(i)
    With dw = New DesktopWindow(i)
 
 
  <font color="#006400">' <i>La console mostra il nome visibile della finestra ed il suo ID:</i></font>
 
  <font color="#006400">' <i>La console mostra il nome visibile della finestra ed il suo ID:</i></font>
      Print .VisibleName, Hex(i), i
+
      Print .VisibleName, Hex(i), i
    End With
+
    End With
 +
  Next
 
   
 
   
  Next
+
  End
   
 
'''End'''
 
  
  
 
===Individuare l'ID di una finestra di nome conosciuto===
 
===Individuare l'ID di una finestra di nome conosciuto===
 
Se vogliamo conoscere l'ID di una finestra di cui conosciamo il nome, possiamo fare come segue:
 
Se vogliamo conoscere l'ID di una finestra di cui conosciamo il nome, possiamo fare come segue:
  <b>Public</b> Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
 
   Dim dWin As DesktopWindow
 
   Dim dWin As DesktopWindow
 
   
 
   
  For Each dWin In Desktop.Windows
+
  For Each dWin In Desktop.Windows
 
 
 
  <font color="#006500">' <i>cerca la finestra avente titolo "titolo_finestra_programma"...</i></font>
 
  <font color="#006500">' <i>cerca la finestra avente titolo "titolo_finestra_programma"...</i></font>
    If dWin.VisibleName = "titolo_finestra_programma" Then      |[[#Note|2]]|
+
    If dWin.VisibleName = "titolo_finestra_programma" Then      |[[#Note|2]]|
 
  <font color="#006500">' <i>...per estrarne l'Id:</i></font>
 
  <font color="#006500">' <i>...per estrarne l'Id:</i></font>
      Print dWin.Id, Hex(dWin.Id)
+
      Print dWin.Id, Hex(dWin.Id)
    Endif
+
    Endif
 
   
 
   
 
   Next
 
   Next
 
   
 
   
  '''End'''
+
  End
  
  
 
===Individuare l'ID di una finestra di indice array conosciuto===
 
===Individuare l'ID di una finestra di indice array conosciuto===
 
Se, invece, vogliamo conoscere l'ID di una finestra di cui conosciamo il numero dell'elemento dell'array di tipo integer, nella quale è posta, possiamo fare come segue:
 
Se, invece, vogliamo conoscere l'ID di una finestra di cui conosciamo il numero dell'elemento dell'array di tipo integer, nella quale è posta, possiamo fare come segue:
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
 
   Dim i As Integer
 
   Dim i As Integer
Riga 111: Riga 107:
 
   
 
   
 
  <font color="#006400">' <i>Ottengo l'ID della finestra, aperta nella scrivania, contenuto nel tot elemento dell'array:</i></font>
 
  <font color="#006400">' <i>Ottengo l'ID della finestra, aperta nella scrivania, contenuto nel tot elemento dell'array:</i></font>
  With dw = New DesktopWindow(Desktop.FindWindow("")[<i>num_Index</i>])
+
  With dw = New DesktopWindow(Desktop.FindWindow(Null, Null, Null)[<i>num_Index</i>])
 
  <font color="#006400">' <i>La console mostra il nome visibile della finestra ed il suo ID:</i></font>
 
  <font color="#006400">' <i>La console mostra il nome visibile della finestra ed il suo ID:</i></font>
 
     Print .VisibleName, Hex(i), i
 
     Print .VisibleName, Hex(i), i
  End With
+
  End With
 +
 +
End
 +
 
 +
 
 +
===Individuare l'ID di una finestra cliccandoci sopra con il mouse===
 +
Se vogliamo conoscere l'ID della finestra di un qualsiasi programma semplicemente cliccandoci sopra con il puntatore del mouse, possiamo utilizzare un codice come il seguente (è necessario porre un ''Timer''):
 +
Public Sub Form_Open()
 +
 +
  With Timer1
 +
    .Delay = 100
 +
    .Start
 +
  End With
 +
 +
End
 +
 
 +
 +
Public Sub Timer1_Timer()
 +
 +
  Dim dw As DesktopWindow
 +
  Dim i As Integer
 +
 
 +
  i = Desktop.ActiveWindow
 +
 +
  With dw = New DesktopWindow(i)
 +
    TextArea1.Text = .VisibleName & " = " & Hex(.Id)
 +
  End With
 
   
 
   
  '''End'''
+
  End
  
  
Riga 125: Riga 147:
 
===Uso della funzione <FONT color="red"><i>Desktop.FindWindow</i></font>===
 
===Uso della funzione <FONT color="red"><i>Desktop.FindWindow</i></font>===
 
Il metodo <i>.FindWindow</i> ritorna un array di identificatori delle finestre X11 presenti sul desktop dell'utente. Con tale metodo si potrà usare il titolo della finestra oppure il nome dell'applicazione che ha generato la propria finestra. Si potrà procedere con il seguente algoritmo:
 
Il metodo <i>.FindWindow</i> ritorna un array di identificatori delle finestre X11 presenti sul desktop dell'utente. Con tale metodo si potrà usare il titolo della finestra oppure il nome dell'applicazione che ha generato la propria finestra. Si potrà procedere con il seguente algoritmo:
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
 
   Dim aHandle As Integer[]
 
   Dim aHandle As Integer[]
   Dim iHandle As Integer
+
   Dim id As Integer
 
   
 
   
    aHandle = Desktop.FindWindow(titolo_finestra_programma)  <font color="#006500">' ...<i>oppure: (nome_applicazione)</i></font>
+
<FONT color=gray>' '' Cerca il numero identificativo della finestra dal titolo della finestra medesima, come memorizzato nella proprietà "WM_NAME" del sistema x11:</font>
 +
  aHandle = Desktop.FindWindow("<FONT color=gray>''titolo_finestra_programma''</font>", Null, Null)
 +
  <font color=gray>' ''oppure dal nome della classe della finestra del programma, come memorizzato nella proprietà "WM_CLASS" del sistema x11:''
 +
' <B>aHandle = Desktop.FindWindow(Null,"</b><I>nome_classe_della_finestra</i><B>", Null)</b>
 +
' ''o anche dal nome della funzione svolta dalla finestra, come memorizzata nella proprietà "WM_WINDOW_ROLE X11" del sistema x11:''
 +
' <B>aHandle = Desktop.FindWindow(Null, Null, "</b><I>ruolo_della_finestra</i><B>")</b></font>
 
   
 
   
  If aHandle.Count = 0 Then  
+
  If aHandle.Count = 0 Then  
    Message.Warning("Finestra non trovata&nbsp;!")
+
    Message.Warning("Finestra non trovata&nbsp;!")
    Return
+
    Return
  Endif
+
  Endif
 
   
 
   
  iHandle = aHandle[0]
+
  id = aHandle[0]
 
   
 
   
  <font color="#006500">' ...<i>che va a mostrare in console:</i></font>
+
  <font color=gray>' ...<i>che va a mostrare in console:</i></font>
  Print iHandle
+
  Print id
 
   
 
   
  '''End'''
+
  End
 
+
Da ricordare che <SPAN Style="text-decoration:underline">negli argomenti del metodo ''Desktop.FindWindow()'' è possibile utilizzare il metacarattere dell'asterisco * come con ''Like''</span>.
  
 
Si potrà utilizzare, però, anche il metodo <i>Windows</i> della classe <i>Desktop</i>:
 
Si potrà utilizzare, però, anche il metodo <i>Windows</i> della classe <i>Desktop</i>:
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
 
  <font color="#006500">' <i>Se si conosce a quale indice corrisponde la finestra del programma da inglobare:</i></font>
 
  <font color="#006500">' <i>Se si conosce a quale indice corrisponde la finestra del programma da inglobare:</i></font>
  Print Desktop.Windows[n].Id
+
  Print Desktop.Windows[n].Id
 
   
 
   
  '''End'''
+
  End
  
===Individuare l'ID di tutte le finestre aperte nella scrivania===
+
====Individuare l'ID di tutte le finestre aperte nella scrivania====
 
Se si intende individuare e raccogliere, mediante la funzione <i>Desktop.FindWindow</i>, l'ID di tutte le finestre aperte in quel momento sulla scrivania, si potrà fare così:
 
Se si intende individuare e raccogliere, mediante la funzione <i>Desktop.FindWindow</i>, l'ID di tutte le finestre aperte in quel momento sulla scrivania, si potrà fare così:
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
   Dim j As Byte
+
   Dim b As Byte
 
   
 
   
  For j = 0 To Desktop.FindWindow("").Max
+
  For b = 0 To Desktop.FindWindow(Null, Null, Null).Max
 +
    With Desktop
 +
      Print .FindWindow(Null, Null, Null)[b], Hex(.FindWindow(Null, Null, Null)[b])
 +
    End With
 +
  Next
 
   
 
   
    With Desktop
+
End
      Print .FindWindow("")[j], Hex(.FindWindow("")[j])
+
oppure:
    End With
+
Public Sub Button1_Click()
 +
 
 +
  For Each i As Integer In Desktop.FindWindow(Null, Null, Null)
 +
    With Desktop
 +
      Print Hex(i), .Windows.FromHandle(i).VisibleName
 +
    End With
 +
  Next
 
   
 
   
  Next
+
  End
   
 
'''End'''
 
  
  
 
+
===Uso della proprietà <FONT color="#FF0000"><i>Desktop.ActiveWindow</i></font>===
==Uso della proprietà <FONT color="#FF0000"><i>Desktop.ActiveWindow</i></font>==
 
 
Per individuare l'ID della "finestra" corrente attiva di primo livello, si può utilizzare anche la proprietà "<i>ActiveWindow</i>" della classe <i>Desktop</i>.
 
Per individuare l'ID della "finestra" corrente attiva di primo livello, si può utilizzare anche la proprietà "<i>ActiveWindow</i>" della classe <i>Desktop</i>.
  
 
Esempio:
 
Esempio:
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
  Desktop.OpenTerminal
+
  Desktop.OpenTerminal
 
   
 
   
 
  <font color="#006500">' <i>Diamo il tempo alla "finestra" del Terminale di aprirsi:</i></font>
 
  <font color="#006500">' <i>Diamo il tempo alla "finestra" del Terminale di aprirsi:</i></font>
  Sleep 1
+
  Wait 1 1
 
   
 
   
  <font color="#006500">' <i>Essendo la finestra del Terminale quella attiva in risalto,</i>
+
  <font color="#006500">' <i>Essendo la finestra del Terminale quella attiva in risalto, sarà restituito l'ID di tale finestra:</i></font>
' <i>sarà restituito l'ID di tale finestra:</i></font>
+
  Print <font color="#B22222">Desktop.ActiveWindow</font>
    Print <font color="#B22222">Desktop.ActiveWindow</font>
 
 
   
 
   
  '''End'''
+
  End
  
  
  
==Uso della proprietà <FONT color="#FF0000"><i>Desktop.Windows</i></font>==
+
===Uso della proprietà <FONT color="#FF0000"><i>Desktop.Windows</i></font>===
 
La proprietà <i>.Windows</i> della Classe 'Desktop<i> ritorna un array di tipo </i>DesktopWindows<i> che rappresenta le finestre di primo livello attive sulla scrivania.</i>
 
La proprietà <i>.Windows</i> della Classe 'Desktop<i> ritorna un array di tipo </i>DesktopWindows<i> che rappresenta le finestre di primo livello attive sulla scrivania.</i>
  
 
Volendo, ad esempio, individuare l'ID di tutte le finestre aperte nella scrivania con detta proprietà, si potrà procedere nel modo che segue:
 
Volendo, ad esempio, individuare l'ID di tutte le finestre aperte nella scrivania con detta proprietà, si potrà procedere nel modo che segue:
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
 
   Dim dw As DesktopWindow
 
   Dim dw As DesktopWindow
 
   
 
   
  For Each dw In Desktop.Windows
+
  For Each dw In Desktop.Windows
 +
    Print Hex(dw2.id)
 +
  Next
 
   
 
   
    Print Hex(dw2.id)
+
  End
 
 
  Next
 
   
 
'''End'''
 
  
 
Ovviamente si potrà individuare una singola finestra in base all'indice dell'array restituito dalla proprietà <i>.Windows</i>:
 
Ovviamente si potrà individuare una singola finestra in base all'indice dell'array restituito dalla proprietà <i>.Windows</i>:
Riga 213: Riga 244:
  
  
=Uso di comandi bash=
+
==Uso della Classe X11==
Si potrà fare uso anche di alcuni comandi <i>bash</i>:
+
Per l'uso della Classe <i>X11</i>, richiamabile attivando il componente ''gb.desktop.x11'', si rimanda alla segute pagina della Wiki:
 +
<BR>[[Individuare ID e nome delle finestre attive, nonché il PID dei loro programmi con le risorse del Componente gb.desktop.x11]]
 +
 
 +
 
 +
=Uso delle funzioni esterne del API di X11=
 +
Per individuare l'ID, nonché il nome, della finestra di un programma, sia di quello Gambas principale che di altro esterno, si potrà fare uso delle funzioni della libreria X11.
  
 +
Per analogia di argomento rinviamo a questa pagina della Wiki:
 +
<BR>[[Individuare l'ID ed il nome di una finestra nonché il PID del programma mediante le funzioni del API di X11]]
  
==Uso del comando <FONT color="red"><i>wmctrl</i></font>==
 
Questo è un comando che normalmente viene lanciato da terminale, e che pertanto in Gambas si potrà lanciare con <i>Shell</i> o <i>Exec</i>. Esempio: <i>Shell "wmctrl -p -l"</i>.
 
'''Private''' h As Process
 
 
 
 
'''Public''' Sub Form_Open()
 
 
  h = Shell "nome_programma"
 
   
 
'''End'''
 
 
 
'''Public''' Sub Button1_Click()
 
 
  Dim a, b, decInt As Integer
 
  Dim lista As String
 
  Dim aStr As String[]
 
 
<font color="#006500">' <i>inserisce nella variabile stringa tutto il risultato del comando "wmctrl"...</i></font>
 
  Shell " wmctrl -p -l" To lista
 
 
<font color="#006500">' ...<i>e lo "spezzetta" nelle sue parole componenti,</i>
 
' <i>che inserisce in piu variabili stringhe[]:</i></font>
 
  aStr = Split(lista, " ")
 
 
  For a = 0 To aStr.Count - 1
 
 
 
    If aStr[a] Like "nome_finestra*" Then
 
      For b = a - 1 To a - 10 Step - 1
 
        If Right(aStr[b], 10) Like "0x*" Then
 
 
<font color="#006500">' <i>Viene mostrato, quindi, il numero esadecimale e quello decimale dell'ID:</i></font>
 
          Print Right(aStr[b], 8), Val("&amp;" &amp; Right(aStr[b], 8))
 
        Endif
 
      Next
 
    Endif
 
 
 
  Next
 
 
'''End'''
 
 
 
'''Public''' Sub Button2_Click()  <FONT color="#006500">' ''Chiude "nome_programma" e poi il programma Gambas:''</font>
 
 
  h.Kill
 
  Me.Close
 
 
'''End'''
 
  
  
==Uso del comando <font color="red"><i>xwininfo</i></font>==
+
=Uso di comandi bash=
Anche questo è un comando che normalmente viene lanciato da terminale, ma bisogna indicare il <u>titolo</u> della finestra dell'applicazione che si vuole inglobare, e che pertanto in Gambas si potrà lanciare con <i>Shell</i> o <i>Exec</i>.
+
Si potrà fare uso anche di alcuni comandi <i>bash</i>:
  
Esempio: <i>Shell "xwininfo -name " &amp; "\titolo_finestra_programma\" | grep " &amp; "\titolo_finestra_programma\".</i>
+
==Uso del comando <FONT color="red"><i>wmctrl</i></font>==
'''Private''' h As Process
+
'''wmctrl''' è un comando che in Gambas potrà essere lanciato con <i>Shell</i> o <i>Exec</i>.
 +
<BR>Esempio:
 +
Public Sub Button1_Click()
 
   
 
   
 
+
   Dim i As Integer
'''Public''' Sub Form_Open()
 
 
  h = Shell "nome_programma"
 
   
 
'''End'''
 
 
 
'''Public''' Sub Button1_Click()
 
 
   Dim decInt As Integer
 
 
   Dim lista As String
 
   Dim lista As String
   Dim aStr As String[]
+
   Dim llss As String[]
 
   
 
   
  <font color="#006500">' <i>inserisce nella variabile stringa tutto il risultato del comando "xwininfo"...</i></font>
+
  <font color="#006500">' <i>Inserisce nella variabile stringa tutto il risultato del comando "wmctrl"...</i></font>
  Shell "xwininfo -name " &amp; "\"titolo_finestra_programma\" | grep " &amp; "\"titolo_finestra_programma\"" To lista
+
  Shell "wmctrl -p -l" To lista
 
<font color="#006500">' ...<i>e lo "spezzetta" nelle sue parole componenti,</i>
 
' <i>che inserisce in piu variabili stringhe[]:</i></font>
 
    aStr = Split(lista, " ")
 
 
<font color="#006500">' <i>prende il contenuto della variabile stringa[] contenente il numero dell'ID (in esadecimale);</i>
 
' <i>lo converte in esadecimale compresibile da Gambas; poi in decimale...</i></font>
 
    decInt = Val("&amp;" &amp; Mid$(aStr[3], 3))
 
 
    
 
    
<font color="#006500">' ...<i>e lo mostra in console:</i></font>
+
  llss = Split(lista, Chr(10))
    Print decInt
 
 
    
 
    
  '''End'''
+
  For i = 0 To llss.Max
+
  <FONT Color=#006500>' ''Si inserirà il nome, anze parzialmente, della finestra del programma, di cui conoscere l'ID:''</font>
+
    If llss[i] Like "*<FONT Color=gray>''Nome_anche_parziale_della_finestra_di_un_programma''</font>*" Then Print Scan(llss[i], "*x* *")[1]
'''Public''' Sub Button2_Click()  <FONT color="#006400">' ''Chiude "nome_programma" e poi il programma Gambas:''</font>
+
  Next
 
   
 
   
  h.Kill
+
  End
  Me.Close
 
   
 
'''End'''
 
  
 
+
==Uso del comando <font color="red"><i>xwininfo</i></font>==
==Uso del comando <font color="red"><i>xprop  | grep -i window</i></font>==
+
Usando '''xwininfo''', bisogna indicare il preciso <u>titolo</u> della finestra dell'applicazione.
Questa linea di comando, anch'essa normalmente lanciata da terminale, consentirà di individuare con il mouse la finestra, della quale ottenere l'ID. In particolare, una volta lanciata questa riga di comando, il puntatore del mouse modificherà il proprio aspetto in quello a forma di croce, si procederà quindi a cliccare sulla finestra interessata.
+
  Public Sub Button1_Click()
 
 
Esempio:
 
  '''Public''' Sub Button1_Click()
 
 
   
 
   
  Dim pr As Process
 
  Dim ss, x As New String[]
 
  Dim s, y As String
 
  Dim j As Byte
 
 
   Dim i As Integer
 
   Dim i As Integer
 +
  Dim lista, s As String
 +
  Dim ss As String[]
 
   
 
   
    pr = Shell "xprop | grep -i window" For Read
+
<font color="#006500">' <i>Inserisce nella variabile stringa tutto il risultato del comando "xwininfo"...</i></font>
 +
  Shell "xwininfo -name " &amp; "\"titolo_esatto_finestra_programma\"" To lista
 
   
 
   
  While Not Eof(pr)
+
<font color="#006500">' ''Prende il contenuto vettore di tipo "stringa[]" contenente il numero dell'ID (in esadecimale) e lo converte in esadecimale compresibile da Gambas e lo mostra:''</font>
    Input #pr, s
+
  s = Scan(lista, "*0x* *")[1]
    If s &lt; Chr(40) Then Continue
+
  Print s
    ss.Add(s)
 
  Wend
 
 
   
 
   
  For j = 0 To ss.Max
+
  <font color="#006500">' ''Poi lo converte in un valore di tipo di dato numerico "Integer"...</i></font>
 
+
  i = Val("&" & s))
    If ss[j] = "_NET_WM_USER_TIME_WINDOW(WINDOW):" Then
+
  <font color="#006500">' ...<i>e lo mostra in console:</i></font>
  <font color="#006500">' <i>Dividiamo la stringa in modo tale da ottenere la seconda parte priva della “x”:</i></font>
 
      x = Split(ss[j + 3], "x")
 
<font color="#006500">' <i>Prendiamo del valore esadecimale soltanto i primi due valori più a destra:</i></font>
 
      y = Right(ss[j + 7], 2)
 
<font color="#006500">' <i>Individua il valore esadecimale preciso della finestra, lo trasforma in decimale...</i></font>
 
      i = Val("&amp;" &amp; x[1]) - Val("&amp;" &amp; y)
 
    Endif
 
 
 
  Next
 
 
  <font color="#006500">' <i>...e lo mostra in console:</i></font>
 
 
   Print i
 
   Print i
 
'''End'''
 
Se si tratta di raccogliere l'ID della finestrina di un <i>MessageBox</i>, generato da un programma, allora il codice sarà un po' diverso:
 
'''Public''' Sub Form_Open()   
 
 
 
  Dim pr As Process   
 
  Dim x As New String[]   
 
  Dim s As String
 
  Dim i As Integer
 
 
 
    pr = Shell "xprop | grep <font color="#B22222">XKLAVIER_STATE</font>" For Read 
 
 
    
 
    
    While Not Eof(pr)     
+
  End
      Input #pr, s  
 
<font color="#006400">' <i>Individua il valore decimale della finestra del "MessageBox":</i></font>
 
      If Eof(pr) Then i = CInt(s) 
 
    Wend
 
 
<font color="#006500">' <i>...e lo mostra in console:</i></font>
 
    Print i
 
 
'''End'''
 
  
  
  
 
=Note=
 
=Note=
[1] E' possibile usare anche il metacarattere <font color="darkslategray"><b>*</b></font>  sostituendo il segno <b>=</b> con <i>LIKE</i>. Esempio: <i>If dWin.name Like "titolo_finestra_prog*" Then...</i>
+
[1] E' possibile usare anche il metacarattere <font color="darkslategray"><b>*</b></font>  sostituendo il segno <b>=</b> con <i>LIKE</i>.  
 +
<BR>Esempio:
 +
<i>If dWin.name <font color=#B22222>Like</font> "titolo_finestra_prog<font color=#B22222>*</font>" Then...</i>

Versione attuale delle 19:40, 24 set 2023

Vi sono diverse modalità per trovare il numero identificativo (ID) della finestra di un'applicazione.


Uso delle Classi di Gambas

Potremo utilizzare varie Classi e risorse di Gambas.


Individuare l'ID della finestra del programma Gambas principale

Per individuare l'ID della finestra del programma gambas principale potremo utilizzare la Classe FMain o la parola Me, oppure la funzione ActiveWindow della Classe Application.


Uso della Classe FMain o la parola Me

L'uso della Classe FMain o della parola Me è senz'altro il metodo più veloce per conoscere l'ID della finestra del programma principale:

Public Sub Button2_Click()

 With FMain
' L'ID della "finestra" del programma principale viene mostrato in decimale ed in esadecimale:
   Print .Id, Hex(.Id)
 End With

End


Uso della funzione ActiveWindow della Classe Application

Public Sub Button1_Click()

 Dim w As Window

 w = Application.ActiveWindow

 Print w.Id, hex(w.Id)
 
End

o più velocemente:

Public Sub Button1_Click()

 Print Application.ActiveWindow.Id

End


Individuare l'ID della finestra che contiene un Controllo

Per individuare l'ID della finestra che contiene un Controllo, possiamo usare la proprietà Window del Controllo medesimo.

Poniamo per esempio di avere un applicativo con due Form: uno principale (FMain) ed uno secondario (Form1). Sul Form secondario, Form1, è posto un Button. Supponiamo di voler individuare l'ID della finestra del Form secondario, ove è posto il Button, al fine di conoscere il nome della finestra e di gestirla. Nel codice della Classe, alla quale appartiene il Form secondario, avremo:

Public Sub aperturaFormSecondario()

 Form1.Show()

 With Button1.Window
' Otteniamo l'ID ed il nome della finestra del Form secondario...:
   Print Hex(.Id), .Name
' ...inoltre, la spostiamo e la ridimensioniamo:
   .Move(200, 500, 50, 300)
 End With

End


Uso della Classe DesktopWindow

In tal caso sarà necessario caricare il componente gb.desktop.


Individuare l'ID di tutte le finestre aperte nella scrivania

Se si intende individuare e raccogliere l'ID di tutte le finestre aperte in quel momento sulla scrivania, si potrà procedere con il seguente algoritmo:

Public Sub Button1_Click()

 Dim i As Integer
 Dim dw As DesktopWindow

' Otteniamo gli ID di tutte le "finestre" aperte sulla scrivania:
 For Each i In Desktop.FindWindow(Null, Null, Null)
   With dw = New DesktopWindow(i)
' La console mostra il nome visibile della finestra ed il suo ID:
     Print .VisibleName, Hex(i), i
   End With
 Next

End


Individuare l'ID di una finestra di nome conosciuto

Se vogliamo conoscere l'ID di una finestra di cui conosciamo il nome, possiamo fare come segue:

Public Sub Button1_Click()

 Dim dWin As DesktopWindow

 For Each dWin In Desktop.Windows
' cerca la finestra avente titolo "titolo_finestra_programma"...
   If dWin.VisibleName = "titolo_finestra_programma" Then      |2|
' ...per estrarne l'Id:
     Print dWin.Id, Hex(dWin.Id)
   Endif

 Next

End


Individuare l'ID di una finestra di indice array conosciuto

Se, invece, vogliamo conoscere l'ID di una finestra di cui conosciamo il numero dell'elemento dell'array di tipo integer, nella quale è posta, possiamo fare come segue:

Public Sub Button1_Click()

 Dim i As Integer
 Dim dw As DesktopWindow

' Ottengo l'ID della finestra, aperta nella scrivania, contenuto nel tot elemento dell'array:
 With dw = New DesktopWindow(Desktop.FindWindow(Null, Null, Null)[num_Index])
' La console mostra il nome visibile della finestra ed il suo ID:
   Print .VisibleName, Hex(i), i
 End With

End


Individuare l'ID di una finestra cliccandoci sopra con il mouse

Se vogliamo conoscere l'ID della finestra di un qualsiasi programma semplicemente cliccandoci sopra con il puntatore del mouse, possiamo utilizzare un codice come il seguente (è necessario porre un Timer):

Public Sub Form_Open()

 With Timer1
   .Delay = 100
   .Start
 End With

End
 

Public Sub Timer1_Timer()

 Dim dw As DesktopWindow
 Dim i As Integer
 
 i = Desktop.ActiveWindow

 With dw = New DesktopWindow(i)
   TextArea1.Text = .VisibleName & " = " & Hex(.Id)
 End With

End


Uso della Classe Desktop

Con la Classe Desktop, richiamabile attivando il componente gb.desktop, si potranno utilizzare la funzione: ".FindWindow" e la proprietà: "ActiveWindow".

Uso della funzione Desktop.FindWindow

Il metodo .FindWindow ritorna un array di identificatori delle finestre X11 presenti sul desktop dell'utente. Con tale metodo si potrà usare il titolo della finestra oppure il nome dell'applicazione che ha generato la propria finestra. Si potrà procedere con il seguente algoritmo:

Public Sub Button1_Click()

 Dim aHandle As Integer[]
 Dim id As Integer

'  Cerca il numero identificativo della finestra dal titolo della finestra medesima, come memorizzato nella proprietà "WM_NAME" del sistema x11:
 aHandle = Desktop.FindWindow("titolo_finestra_programma", Null, Null)
' oppure dal nome della classe della finestra del programma, come memorizzato nella proprietà "WM_CLASS" del sistema x11:
' aHandle = Desktop.FindWindow(Null,"nome_classe_della_finestra", Null)
' o anche dal nome della funzione svolta dalla finestra, come memorizzata nella proprietà "WM_WINDOW_ROLE X11" del sistema x11:
' aHandle = Desktop.FindWindow(Null, Null, "ruolo_della_finestra")

 If aHandle.Count = 0 Then 
   Message.Warning("Finestra non trovata !")
   Return
 Endif

 id = aHandle[0]

' ...che va a mostrare in console:
 Print id

End

Da ricordare che negli argomenti del metodo Desktop.FindWindow() è possibile utilizzare il metacarattere dell'asterisco * come con Like.

Si potrà utilizzare, però, anche il metodo Windows della classe Desktop:

Public Sub Button1_Click()

' Se si conosce a quale indice corrisponde la finestra del programma da inglobare:
 Print Desktop.Windows[n].Id

End

Individuare l'ID di tutte le finestre aperte nella scrivania

Se si intende individuare e raccogliere, mediante la funzione Desktop.FindWindow, l'ID di tutte le finestre aperte in quel momento sulla scrivania, si potrà fare così:

Public Sub Button1_Click()

 Dim b As Byte

 For b = 0 To Desktop.FindWindow(Null, Null, Null).Max
   With Desktop
     Print .FindWindow(Null, Null, Null)[b], Hex(.FindWindow(Null, Null, Null)[b])
   End With
 Next

End 

oppure:

Public Sub Button1_Click()
 
 For Each i As Integer In Desktop.FindWindow(Null, Null, Null)
   With Desktop
     Print Hex(i), .Windows.FromHandle(i).VisibleName
   End With
 Next

End


Uso della proprietà Desktop.ActiveWindow

Per individuare l'ID della "finestra" corrente attiva di primo livello, si può utilizzare anche la proprietà "ActiveWindow" della classe Desktop.

Esempio:

Public Sub Button1_Click()

 Desktop.OpenTerminal

' Diamo il tempo alla "finestra" del Terminale di aprirsi:
 Wait 1 1

' Essendo la finestra del Terminale quella attiva in risalto, sarà restituito l'ID di tale finestra:
 Print Desktop.ActiveWindow

End


Uso della proprietà Desktop.Windows

La proprietà .Windows della Classe 'Desktop ritorna un array di tipo DesktopWindows che rappresenta le finestre di primo livello attive sulla scrivania.

Volendo, ad esempio, individuare l'ID di tutte le finestre aperte nella scrivania con detta proprietà, si potrà procedere nel modo che segue:

Public Sub Button1_Click()

 Dim dw As DesktopWindow

 For Each dw In Desktop.Windows
   Print Hex(dw2.id)
 Next

End

Ovviamente si potrà individuare una singola finestra in base all'indice dell'array restituito dalla proprietà .Windows:

dw = Desktop.Windows[n]

oppure sulla base del numero dell'handle (che è un Integer) della finestra che si intende individuare:

dw = Desktop.Windows.FromHandle(handle_della_finestra)


Uso della Classe X11

Per l'uso della Classe X11, richiamabile attivando il componente gb.desktop.x11, si rimanda alla segute pagina della Wiki:
Individuare ID e nome delle finestre attive, nonché il PID dei loro programmi con le risorse del Componente gb.desktop.x11


Uso delle funzioni esterne del API di X11

Per individuare l'ID, nonché il nome, della finestra di un programma, sia di quello Gambas principale che di altro esterno, si potrà fare uso delle funzioni della libreria X11.

Per analogia di argomento rinviamo a questa pagina della Wiki:
Individuare l'ID ed il nome di una finestra nonché il PID del programma mediante le funzioni del API di X11


Uso di comandi bash

Si potrà fare uso anche di alcuni comandi bash:

Uso del comando wmctrl

wmctrl è un comando che in Gambas potrà essere lanciato con Shell o Exec.
Esempio:

Public Sub Button1_Click()

 Dim i As Integer
 Dim lista As String
 Dim llss As String[]

' Inserisce nella variabile stringa tutto il risultato del comando "wmctrl"...
 Shell "wmctrl -p -l" To lista
 
 llss = Split(lista, Chr(10))
 
 For i = 0 To llss.Max
' Si inserirà il nome, anze parzialmente, della finestra del programma, di cui conoscere l'ID:
   If llss[i] Like "*Nome_anche_parziale_della_finestra_di_un_programma*" Then Print Scan(llss[i], "*x* *")[1]
 Next

End

Uso del comando xwininfo

Usando xwininfo, bisogna indicare il preciso titolo della finestra dell'applicazione.

Public Sub Button1_Click()

 Dim i As Integer
 Dim lista, s As String
 Dim ss As String[]

' Inserisce nella variabile stringa tutto il risultato del comando "xwininfo"...
 Shell "xwininfo -name " & "\"titolo_esatto_finestra_programma\"" To lista

' Prende il contenuto vettore di tipo "stringa[]" contenente il numero dell'ID (in esadecimale) e lo converte in esadecimale compresibile da Gambas e lo mostra:
 s = Scan(lista, "*0x* *")[1]
 Print s

' Poi lo converte in un valore di tipo di dato numerico "Integer"...</i>
 i = Val("&" & s))
' ...e lo mostra in console:
 Print i
 
End


Note

[1] E' possibile usare anche il metacarattere * sostituendo il segno = con LIKE.
Esempio:

If dWin.name Like "titolo_finestra_prog*" Then...