Buenas a todos!!!

Estoy haciendo una aplicación para llevar un control de tiempos, controlando cuando se enciende el pc, cuando se bloquea, suspende....
Se trata de una aplicacion oculta, que se inicia con el inicio del sistema.

Pues tengo 2 dudas:

- El tema es que cuando el equipo está bloqueado, parace ser que internamente se disparan los eventos de bloqueo y desbloqueo...
Cada vez que se dispara un evento lo capturo e inserto un registro en bbdd.
Pues pasado un rato, no siempre, cuando desbloqueo el equipo y compruebo la base de datos, puedo observar que despues del registro de bloqueo que realizé bloqueando el equipo, se han insertado dos registros mas, uno de desbloqueo y otro de bloqueo.
Cuando ya desbloqueo yo me inserta el registro de debloqueo, pero se han quedado los dos de enmedio, cuiando en realidad el equipo estaba bloqueado.


- Otro duda que tengo es que cuando suspendo o hiberno el evento es el mismo, no hay manera de diferenciar cuando es hibernación y cuando es suspensión?

Aqui os dejo el codigo:PD: acepto sugerencias para mejorar el código.

Código:
  1. Imports Microsoft.Win32
  2.  
  3. Public Class Control_tiempos
  4.  
  5.     Private EVENTO As String
  6.     Private EQUIPO As String
  7.  
  8.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  9.  
  10.         Me.Opacity = 0
  11.         Me.ShowInTaskbar = 0
  12.  
  13.         Dim x As conexion = New conexion
  14.  
  15.         Me.EVENTO = "Encendido"
  16.         Me.EQUIPO = SystemInformation.ComputerName
  17.         Me.TXTMENS.Text = "Encendido: " + SystemInformation.ComputerName + " - " + Date.Now.ToString
  18.  
  19.         x.CON()
  20.         x.InsertaCambio(Me.TXTMENS.Text, Me.EVENTO, Me.EQUIPO)
  21.         x.Descon()
  22.  
  23.         CreaHandlers()
  24.  
  25.     End Sub
  26.  
  27.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  28.  
  29.         AddHandler SystemEvents.SessionEnding, AddressOf Apaga
  30.         AddHandler SystemEvents.PowerModeChanged, AddressOf Suspende
  31.         AddHandler SystemEvents.SessionSwitch, AddressOf Bloquea
  32.  
  33.     End Sub
  34.     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  35.  
  36.         RemoveHandler SystemEvents.SessionEnding, AddressOf Apaga
  37.         RemoveHandler SystemEvents.PowerModeChanged, AddressOf Suspende
  38.         RemoveHandler SystemEvents.SessionSwitch, AddressOf Bloquea
  39.  
  40.     End Sub
  41.     Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
  42.  
  43.         Dim x As conexion = New conexion
  44.  
  45.         x.CON()
  46.         x.InsertaCambio(Me.TXTMENS.Text, Me.EVENTO, Me.EQUIPO)
  47.         x.Descon()
  48.  
  49.     End Sub
  50.  
  51.     Private Sub CreaHandlers()
  52.  
  53.         AddHandler SystemEvents.SessionEnding, AddressOf Apaga
  54.         AddHandler SystemEvents.PowerModeChanged, AddressOf Suspende
  55.         AddHandler SystemEvents.SessionSwitch, AddressOf Bloquea
  56.         AddHandler SystemEvents.PaletteChanged, AddressOf p
  57.         AddHandler SystemEvents.DisplaySettingsChanging, AddressOf D
  58.  
  59.     End Sub
  60.     Private Sub EliminaHandlers()
  61.  
  62.         RemoveHandler SystemEvents.SessionEnding, AddressOf Apaga
  63.         RemoveHandler SystemEvents.PowerModeChanged, AddressOf Suspende
  64.         RemoveHandler SystemEvents.SessionSwitch, AddressOf Bloquea
  65.  
  66.     End Sub
  67.  
  68.     Private Sub Apaga(ByVal sender As Object, ByVal e As EventArgs)
  69.        
  70.         Me.EVENTO = "Apagado"
  71.         Me.EQUIPO = SystemInformation.ComputerName
  72.         Me.TXTMENS.Text = "Apagado: " + SystemInformation.ComputerName + " - " + Date.Now.ToString
  73.  
  74.         Dim x As conexion = New conexion
  75.         x.CON()
  76.         x.InsertaCambio(Me.TXTMENS.Text, Me.EVENTO, Me.EQUIPO)
  77.         x.Descon()
  78.  
  79.         EliminaHandlers()
  80.  
  81.     End Sub
  82.     Private Sub Suspende(ByVal sender As Object, ByVal e As PowerModeChangedEventArgs)
  83.  
  84.         'CUANDO EL EQUIPO SUSPENDE:
  85.         'Se insertan los registros en el siguiente orden:
  86.         '1-Supendido, 2-Activado, 3-Bloqueado, 4-Desbloqueado
  87.         'CUANDO EL EQUIPO HIBERNA:
  88.         'Se insertan los registros en el siguiente orden:
  89.         '1-Supendido, 2-Bloqueado, 3-Activado, 4-Desbloqueado
  90.  
  91.         If e.Mode = PowerModes.Suspend Then
  92.             Me.TXTMENS.Text = "Suspendido:  " + SystemInformation.ComputerName + " - " + Date.Now.ToString
  93.             Me.EVENTO = "Suspendido"
  94.         End If
  95.  
  96.         If e.Mode = PowerModes.Resume Then
  97.             Me.TXTMENS.Text = "Activado: " + SystemInformation.ComputerName + " - " + Date.Now.ToString
  98.             Me.EVENTO = "Activado"
  99.         End If
  100.  
  101.         Me.EQUIPO = SystemInformation.ComputerName
  102.  
  103.         Dim x As conexion = New conexion
  104.         x.CON()
  105.         x.InsertaCambio(Me.TXTMENS.Text, Me.EVENTO, Me.EQUIPO)
  106.         x.Descon()
  107.  
  108.     End Sub
  109.     Private Sub Bloquea(ByVal sender As Object, ByVal e As SessionSwitchEventArgs)
  110.  
  111.         If e.Reason = SessionSwitchReason.SessionLock Then
  112.             Me.TXTMENS.Text = "Bloqueado: " + SystemInformation.ComputerName + " - " + DateTime.Now
  113.             Me.EVENTO = "Bloqueado"
  114.         End If
  115.         If e.Reason = SessionSwitchReason.SessionUnlock Then
  116.             Me.TXTMENS.Text = "Desbloqueado: " + SystemInformation.ComputerName + " - " + DateTime.Now
  117.             Me.EVENTO = "Desbloqueado"
  118.         End If
  119.  
  120.         Me.EQUIPO = SystemInformation.ComputerName
  121.  
  122.         Dim x As conexion = New conexion
  123.         x.CON()
  124.         x.InsertaCambio(Me.TXTMENS.Text, Me.EVENTO, Me.EQUIPO)
  125.         x.Descon()
  126.  
  127.     End Sub
  128.     Private Sub p()
  129.  
  130.         Me.EVENTO = "P"
  131.         Me.EQUIPO = "P"
  132.         Me.TXTMENS.Text = "P"
  133.  
  134.         Dim x As conexion = New conexion
  135.         x.CON()
  136.         x.InsertaCambio(Me.TXTMENS.Text, Me.EVENTO, Me.EQUIPO)
  137.         x.Descon()
  138.  
  139.     End Sub
  140.     Private Sub D()
  141.  
  142.         Me.EVENTO = "D"
  143.         Me.EQUIPO = "D"
  144.         Me.TXTMENS.Text = "D"
  145.  
  146.         Dim x As conexion = New conexion
  147.         x.CON()
  148.         x.InsertaCambio(Me.TXTMENS.Text, Me.EVENTO, Me.EQUIPO)
  149.         x.Descon()
  150.  
  151.     End Sub
  152.  
  153.  
  154. End Class