dejo este código para obtener con las funciones externas del API de X11 el numero identificativo, el nombre visible de la ventana de los programas activos, y el PID de estos programas.
Private Const MAX_PROPERTY_VALUE_LEN As Integer = 4096
Library "libX11:6.3.0"
Private Const XA_CARDINAL As Integer = 6
Private Const XA_WINDOW As Integer = 33
' Display *XOpenDisplay(display_name)
' Opens a connection to the X server that controls a display.
Private Extern XOpenDisplay(display$ As String) As Pointer
' XCloseDisplay (display)
' Closes a display or disconnect from the X server.
Private Extern XCloseDisplay(displayP As Pointer)
' Window XDefaultRootWindow(display)
' Return the root window for the default screen.
Private Extern XDefaultRootWindow(displayP As Pointer) As Integer
' Atom XInternAtom(display, atom_name, only_if_exists)
' Returns the atom identifier associated with the specified atom_name string.
Private Extern XInternAtom(displayP As Pointer, atom_name As String, only_if_exists As Boolean) As Integer
' int XGetWindowProperty(display, w, property, long_offset, long_length, delete, req_type, actual_type_return, actual_format_return, nitems_return, bytes_after_return, prop_return)
' Returns the actual type of the property; the actual format of the property.
Private Extern XGetWindowProperty(displayP As Pointer, wI As Integer, py As Integer, lo As Long, ll As Long, d As Boolean, rt As Integer, at As Pointer, af As Pointer, ni As Pointer, ba As Pointer, pr As Pointer) As Integer
' XGetWMName(display, w, text_prop_return)
' Calls XGetTextProperty() to obtain the WM_NAME property.
Private Extern XGetWMName(displayP As Pointer, w As Integer, text_prop_return As Pointer) As Integer
Public Sub Main()
Dim disp, dati, p, datPID As Pointer
Dim x_num_Atom, rootW, tipo, formato As Integer
Dim err, n_fin, bytes_succ, i As Integer
Dim stId, stPid As Stream
Dim b As Byte
Dim pid As Integer
Dim id As String
disp = XOpenDisplay(Null)
If IsNull(disp) Then Error.Raise("Impossible abrir el server display X !")
rootW = XDefaultRootWindow(disp)
x_num_Atom = XInternAtom(disp, "_NET_CLIENT_LIST", False)
err = XGetWindowProperty(disp, rootW, x_num_Atom, 0, MAX_PROPERTY_VALUE_LEN / 4, False, XA_WINDOW, VarPtr(tipo), VarPtr(formato), VarPtr(n_fin), VarPtr(bytes_succ), VarPtr(dati))
If err <> 0 Then Error.Raise("Impossible obtener datos de la función 'XGetWindowProperty' !")
If XA_WINDOW <> tipo Then Error.Raise("Tipo inválido de propiedad '_NET_CLIENT_LIST' !")
Print "Id", Null, "PID", "Nombre ventana\n"
p = Alloc(32)
stId = Memory dati For Read
For b = 1 To n_fin * 2
Read #stId, i
If i > 0 Then
XGetWMName(disp, i, p)
id = Hex(i)
x_num_Atom = XInternAtom(disp, "_NET_WM_PID", False)
err = XGetWindowProperty(disp, i, x_num_Atom, 0, MAX_PROPERTY_VALUE_LEN / 4, False, XA_CARDINAL, VarPtr(tipo), VarPtr(formato), VarPtr(n_fin), VarPtr(bytes_succ), VarPtr(datPID))
If err <> 0 Then Error.Raise("Impossible obtener datos de la función 'XGetWindowProperty' !")
If IsNull(datPID) = False Then
stPid = Memory datPID For Read
Read #stPid, pid
Endif
Print id, Null, pid, String@(Pointer@(p))
Endif
Next
' ...terminando:
stPid.Close
stId.Close
Free(p)
XCloseDisplay(disp)
End
Library "libX11:6.3.0"
Private Const XA_CARDINAL As Integer = 6
Private Const XA_WINDOW As Integer = 33
' Display *XOpenDisplay(display_name)
' Opens a connection to the X server that controls a display.
Private Extern XOpenDisplay(display$ As String) As Pointer
' XCloseDisplay (display)
' Closes a display or disconnect from the X server.
Private Extern XCloseDisplay(displayP As Pointer)
' Window XDefaultRootWindow(display)
' Return the root window for the default screen.
Private Extern XDefaultRootWindow(displayP As Pointer) As Integer
' Atom XInternAtom(display, atom_name, only_if_exists)
' Returns the atom identifier associated with the specified atom_name string.
Private Extern XInternAtom(displayP As Pointer, atom_name As String, only_if_exists As Boolean) As Integer
' int XGetWindowProperty(display, w, property, long_offset, long_length, delete, req_type, actual_type_return, actual_format_return, nitems_return, bytes_after_return, prop_return)
' Returns the actual type of the property; the actual format of the property.
Private Extern XGetWindowProperty(displayP As Pointer, wI As Integer, py As Integer, lo As Long, ll As Long, d As Boolean, rt As Integer, at As Pointer, af As Pointer, ni As Pointer, ba As Pointer, pr As Pointer) As Integer
' XGetWMName(display, w, text_prop_return)
' Calls XGetTextProperty() to obtain the WM_NAME property.
Private Extern XGetWMName(displayP As Pointer, w As Integer, text_prop_return As Pointer) As Integer
Public Sub Main()
Dim disp, dati, p, datPID As Pointer
Dim x_num_Atom, rootW, tipo, formato As Integer
Dim err, n_fin, bytes_succ, i As Integer
Dim stId, stPid As Stream
Dim b As Byte
Dim pid As Integer
Dim id As String
disp = XOpenDisplay(Null)
If IsNull(disp) Then Error.Raise("Impossible abrir el server display X !")
rootW = XDefaultRootWindow(disp)
x_num_Atom = XInternAtom(disp, "_NET_CLIENT_LIST", False)
err = XGetWindowProperty(disp, rootW, x_num_Atom, 0, MAX_PROPERTY_VALUE_LEN / 4, False, XA_WINDOW, VarPtr(tipo), VarPtr(formato), VarPtr(n_fin), VarPtr(bytes_succ), VarPtr(dati))
If err <> 0 Then Error.Raise("Impossible obtener datos de la función 'XGetWindowProperty' !")
If XA_WINDOW <> tipo Then Error.Raise("Tipo inválido de propiedad '_NET_CLIENT_LIST' !")
Print "Id", Null, "PID", "Nombre ventana\n"
p = Alloc(32)
stId = Memory dati For Read
For b = 1 To n_fin * 2
Read #stId, i
If i > 0 Then
XGetWMName(disp, i, p)
id = Hex(i)
x_num_Atom = XInternAtom(disp, "_NET_WM_PID", False)
err = XGetWindowProperty(disp, i, x_num_Atom, 0, MAX_PROPERTY_VALUE_LEN / 4, False, XA_CARDINAL, VarPtr(tipo), VarPtr(formato), VarPtr(n_fin), VarPtr(bytes_succ), VarPtr(datPID))
If err <> 0 Then Error.Raise("Impossible obtener datos de la función 'XGetWindowProperty' !")
If IsNull(datPID) = False Then
stPid = Memory datPID For Read
Read #stPid, pid
Endif
Print id, Null, pid, String@(Pointer@(p))
Endif
Next
' ...terminando:
stPid.Close
stId.Close
Free(p)
XCloseDisplay(disp)
End