Sobre los Handles del SystemTray...

Iniciado por Eleкtro, 9 Abril 2013, 19:48 PM

0 Miembros y 1 Visitante están viendo este tema.

Eleкtro

Este tema me lleva días matándome, he creado 5 posts sobre temas relacionados con los handles en StackOverFlow, porque no me aclaro nada con las funciones de la API (FindWindow, FindWindowEx, etc...).

A ver, lo que necesito es, saber si una aplicación de terceros ha mostrado su icono en el systemtray, es decir, saber si "X" icono existe en el SysTray, ya séa buscando el icono por el handle del proceso, o por el nombre de la ventana, o como séa.

Para esto, primero intento obtener el handle de la aplicación, y luego el handle de mi systray, pero hasta aquí, ya no sé como seguir ni que debo hacer.

Código (vbnet) [Seleccionar]
Imports System.Runtime.InteropServices

Public Class Form1

   Public Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
   Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

   Public Shared Function WindowHandle(sTitle As String) As Long
       Return FindWindow(vbNullString, sTitle)
   End Function

   Private Shared Function GetSystemTrayHandle() As IntPtr
       Dim hWndTray As IntPtr = FindWindow("Shell_TrayWnd", Nothing)
       If hWndTray <> IntPtr.Zero Then
           hWndTray = FindWindowEx(hWndTray, IntPtr.Zero, "TrayNotifyWnd", Nothing)
           If hWndTray <> IntPtr.Zero Then
               hWndTray = FindWindowEx(hWndTray, IntPtr.Zero, "SysPager", Nothing)
               If hWndTray <> IntPtr.Zero Then
                   hWndTray = FindWindowEx(hWndTray, IntPtr.Zero, "ToolbarWindow32", Nothing)
                   Return hWndTray
               End If
           End If
       End If

       Return IntPtr.Zero
   End Function

   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
       MsgBox(WindowHandle("Steam")) ' 6687230
       MsgBox(GetSystemTrayHandle()) ' 65728
   End Sub

End Class