2013-03-14 6 views
1

j'utilise ce code pour détecter une fenêtre spécifique est active, et quand il est i sauver la poignée dans une variable:vérifier si la poignée existe

Dim kiosk As IntPtr 
    Dim l As Integer = GetWindowTextLength(GetForegroundWindow()) 
    Dim WindowTextBuffer As String = New String(Chr(0), l) 
    GetWindowText(GetForegroundWindow(), WindowTextBuffer, l + 1) 

    Debug.WriteLine(WindowTextBuffer) 


    If WindowTextBuffer = "FFKiosk" Then 
     kiosk = GetForegroundWindow() 
    End If 

jusqu'à présent, tout fonctionne bien. Mais je voudrais vérifier que cette fenêtre est toujours active, sinon je voudrais mettre la variable kiosque à null. comment puis-je vérifier si ce handle est toujours valide?

Répondre

1

Eh bien, la réponse à votre question est: importer la fonction IsWindow de user32.dll

<DllImport("user32.dll", CharSet:=CharSet.Auto, ExactSpelling:=True)> _ 
Public Shared Function IsWindow(ByVal hWnd As IntPtr) As Boolean 
End Function 

puis,

If IsWindow(kiosk) Then 
    ' do something 
End If 

Mais MSDN warns against that si votre fil n'est pas une qui a créé la fenêtre: "Un thread ne doit pas utiliser IsWindow pour une fenêtre qu'il n'a pas créée car la fenêtre a pu être détruite après que la fonction a été appelée.poignée pourrait même pointer vers une fenêtre différente. " Au lieu de cela, mieux vaut obtenir le (s) ID de processus et vérifier si le (s) processus est toujours en cours d'exécution.

Dim processes As System.Diagnostics.Process() = System.Diagnostics.Process.GetProcessesByName("theExeName") 
    Dim processIds(processes.Length) As Integer 

    If processes.Length > 0 Then 
     Dim i As Integer = 0 
     For Each processId As Integer In processIds 
      processIds(i) = processes(i).Id 
     Next