Muchas veces en las implementaciones es necesario incorporar una funcionalidad para "auto cerrar" el cliente de SalesLogix cuando el usuario deja de utilizarlo.
En vista de que el cliente no trae esta funcionalidad directamente de la caja, aquí les traigo un programita en NET que se encarga de hacerlo. Si analizan el código verán que esto aplica para cualquier aplicación, no únicamente SalesLogix, y si lo modifican un poco, pueden hacer "logoff" de la sesión del usuario en lugar de "matar" el EXE... todo depende de ustedes.
Les voy a mostrar puntualmente como monitorear y automatizar el cierre, pero cómo ejecutan el monitor cuando SalesLogix se abre se los dejo a su criterio. Además, les estoy compartiendo el prototipo inicial aunque 100% funcional, así que no hay comentarios y parte del código puede no verse tan "lindo", por favor no critiquen!
Para esto utilicé Visual Basic NET 2010. No recuerdo si tuve que añadir una referencia a Microsoft.VisualBasic.Compatibility.dll pero el código funciona perfectamente bien sin modificarle nada!
Primero, creamos un formulario en nuestra aplicación y le insertamos un ListBox que se llamará "List1". Le agregamos un timer "Timer1" con intervalo de 50, y un "Timer2" con intervalo de 1000.
Luego en el código del formulario pegamos lo siguiente:
Option Strict Off
Option Explicit On
Imports VB = Microsoft.VisualBasic
Friend Class Form1
Inherits System.Windows.Forms.Form
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Short
Dim timeout As Short
Dim start As Short
Dim hwnd As Integer = 0
Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
Me.Hide()
End Sub
Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
On Error GoTo Err
start = 0
Me.ShowInTaskbar = False
timeout = CDbl(VB.Command()) * 60
Exit Sub
err:
timeout = 300
End Sub
Private Sub Timer1_Tick(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Timer1.Tick
Dim i As Object
Dim lngBufferLen As Integer
Dim strClassName As String
Dim lngResult As Integer
For i = 0 To 255
If GetAsyncKeyState(i) Then
End If
Next i
Dim auxhwnd As Integer = GetForegroundWindow()
lngBufferLen = GetWindowTextLength(auxhwnd) + 1
strClassName = Space(lngBufferLen)
lngResult = GetWindowText(auxhwnd, strClassName, lngBufferLen)
strClassName = VB.Left(strClassName, lngBufferLen - 1)
If InStr(1, strClassName, "Sage SalesLogix") > 0 Then
hwnd = auxhwnd
For i = 0 To 255
If GetAsyncKeyState(i) Then
List1.Items.Add("Tecla o Mouse - " & strClassName & " Handle: " & auxhwnd.ToString)
start = 0
End If
Next i
End If
End Sub
Private Sub Timer2_Tick(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Timer2.Tick
On Error GoTo salida
start = start + 1
If start = timeout Then
If hwnd <> 0 Then
Dim pid As Integer
GetWindowThreadProcessId(hwnd, pid)
Dim xproc As Process = Process.GetProcessById(pid)
xproc.Kill()
MsgBox("Se ha cerrado el SalesLogix porque ha llegado al tiempo límite de inactividad!", vbInformation, "Inactividad Detectada")
End If
End
End If
Exit Sub
salida:
End Sub
End Class
Ahora, creamos un módulo que yo llamé "Module1" y le pegamos lo siguiente:
Option Strict Off
Option Explicit On
Module Module1
Public Declare Function GetForegroundWindow Lib "user32" () As Integer
Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA"(ByVal hwnd As Integer) As Integer
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA"(ByVal hwnd As Integer, ByVal lpString As String, ByVal cch As Integer) As Integer
Public Declare Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As IntPtr, ByRef lpdwProcessID As Integer) As Integer
End Module
Listo! Prueben abriendo un SalesLogix, luego ejecuten el programa. Si vieron el Form Load, notarán que si al ejecutarlo lo hacen con un número, estarán estableciendo el tiempo en minutos del "time out" que cierra el SalesLogix. Si no lo establecen, se va por default a 5 minutos.
Si hacen clic con el ratón, o presionan alguna tecla, verán en el ListBox como va registrando la actividad, y luego del tiempo establecido de no usarlo, pues lo cerrará.
El truco con el programita, es que SalesLogix debe estar "en foco" en algún momento mientras se monitorea para que se pueda recoger el "hwnd" del EXE, pero les digo que desde que lo uso, nunca nadie ha reportado que el SalesLogix se ha mantenido abierto luego de la cantidad de minutos establecida.
Si esta entrada te sirvió, porfa, haz clic a algún anuncio y míralo un par de segundos... ;)
En vista de que el cliente no trae esta funcionalidad directamente de la caja, aquí les traigo un programita en NET que se encarga de hacerlo. Si analizan el código verán que esto aplica para cualquier aplicación, no únicamente SalesLogix, y si lo modifican un poco, pueden hacer "logoff" de la sesión del usuario en lugar de "matar" el EXE... todo depende de ustedes.
Les voy a mostrar puntualmente como monitorear y automatizar el cierre, pero cómo ejecutan el monitor cuando SalesLogix se abre se los dejo a su criterio. Además, les estoy compartiendo el prototipo inicial aunque 100% funcional, así que no hay comentarios y parte del código puede no verse tan "lindo", por favor no critiquen!
Para esto utilicé Visual Basic NET 2010. No recuerdo si tuve que añadir una referencia a Microsoft.VisualBasic.Compatibility.dll pero el código funciona perfectamente bien sin modificarle nada!
Primero, creamos un formulario en nuestra aplicación y le insertamos un ListBox que se llamará "List1". Le agregamos un timer "Timer1" con intervalo de 50, y un "Timer2" con intervalo de 1000.
Luego en el código del formulario pegamos lo siguiente:
Option Strict Off
Option Explicit On
Imports VB = Microsoft.VisualBasic
Friend Class Form1
Inherits System.Windows.Forms.Form
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Short
Dim timeout As Short
Dim start As Short
Dim hwnd As Integer = 0
Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
Me.Hide()
End Sub
Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
On Error GoTo Err
start = 0
Me.ShowInTaskbar = False
timeout = CDbl(VB.Command()) * 60
Exit Sub
err:
timeout = 300
End Sub
Private Sub Timer1_Tick(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Timer1.Tick
Dim i As Object
Dim lngBufferLen As Integer
Dim strClassName As String
Dim lngResult As Integer
For i = 0 To 255
If GetAsyncKeyState(i) Then
End If
Next i
Dim auxhwnd As Integer = GetForegroundWindow()
lngBufferLen = GetWindowTextLength(auxhwnd) + 1
strClassName = Space(lngBufferLen)
lngResult = GetWindowText(auxhwnd, strClassName, lngBufferLen)
strClassName = VB.Left(strClassName, lngBufferLen - 1)
If InStr(1, strClassName, "Sage SalesLogix") > 0 Then
hwnd = auxhwnd
For i = 0 To 255
If GetAsyncKeyState(i) Then
List1.Items.Add("Tecla o Mouse - " & strClassName & " Handle: " & auxhwnd.ToString)
start = 0
End If
Next i
End If
End Sub
Private Sub Timer2_Tick(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Timer2.Tick
On Error GoTo salida
start = start + 1
If start = timeout Then
If hwnd <> 0 Then
Dim pid As Integer
GetWindowThreadProcessId(hwnd, pid)
Dim xproc As Process = Process.GetProcessById(pid)
xproc.Kill()
MsgBox("Se ha cerrado el SalesLogix porque ha llegado al tiempo límite de inactividad!", vbInformation, "Inactividad Detectada")
End If
End
End If
Exit Sub
salida:
End Sub
End Class
Ahora, creamos un módulo que yo llamé "Module1" y le pegamos lo siguiente:
Option Strict Off
Option Explicit On
Module Module1
Public Declare Function GetForegroundWindow Lib "user32" () As Integer
Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA"(ByVal hwnd As Integer) As Integer
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA"(ByVal hwnd As Integer, ByVal lpString As String, ByVal cch As Integer) As Integer
Public Declare Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As IntPtr, ByRef lpdwProcessID As Integer) As Integer
End Module
Listo! Prueben abriendo un SalesLogix, luego ejecuten el programa. Si vieron el Form Load, notarán que si al ejecutarlo lo hacen con un número, estarán estableciendo el tiempo en minutos del "time out" que cierra el SalesLogix. Si no lo establecen, se va por default a 5 minutos.
Si hacen clic con el ratón, o presionan alguna tecla, verán en el ListBox como va registrando la actividad, y luego del tiempo establecido de no usarlo, pues lo cerrará.
El truco con el programita, es que SalesLogix debe estar "en foco" en algún momento mientras se monitorea para que se pueda recoger el "hwnd" del EXE, pero les digo que desde que lo uso, nunca nadie ha reportado que el SalesLogix se ha mantenido abierto luego de la cantidad de minutos establecida.
Si esta entrada te sirvió, porfa, haz clic a algún anuncio y míralo un par de segundos... ;)