Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0032: Ursache für Programmaktivierung herausfinden

 von 

Beschreibung

Dieser Tipp zeigt, wie leicht sich ermitteln lässt aus welchem Grund ein Anwendungsfenster aktiviert worden ist.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Framework-Version(en):

.NET Framework 1.0, .NET Framework 1.1, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5

.NET-Version(en):

Visual Basic 2002, Visual Basic 2003, Visual Basic 2005, Visual Basic 2008

Download:

Download des Beispielprojektes [3,44 KB]

' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!

' Projektversion:   Visual Studio 2002/2003
' Option Strict:    An
' Option Explicit:  An
'
' Referenzen: 
'  - System
'  - System.Drawing
'  - System.Windows.Forms
'

' ##############################################################################
' ############################### ApiHelper.vb #################################
' ##############################################################################
Option Explicit On 
Option Strict On
Option Compare Binary

Imports System

' <remarks>
'   Stellt Funktionen bereit, die in Verbindung mit 
'   Zugriffen auf das 32-Bit-Windows-API benötigt
'   werden.
' </remarks>
Public Class ApiHelper

    ' <summary>
    '   Gibt einen 32-Bit-Integer, der die niederwertigen 
    '   32 Bits von <paramref name="Value"/> enthält, zurück.
    ' </summary>
    ' <param name="Value">Wert, dessen Low-Word berechnet werden soll.</param>
    ' <returns>Low-Word von <paramref name="Value"/>.</returns>
    Public Shared Function LOWORD(ByRef Value As Int32) As Int32
        Return Value And &HFFFF
    End Function

    ' <summary>
    '   Gibt einen 32-Bit-Integer, der die niederwertigen 32 
    '   Bits von <paramref name="Value"/> enthält, zurück.
    ' </summary>
    ' <param name="Value">Wert, dessen Low-Word berechnet werden soll.</param>
    ' <returns>Low-Word von <paramref name="Value"/>.</returns>
    Public Shared Function LOWORD(ByRef Value As IntPtr) As Int32
        Return LOWORD(Value.ToInt32())
    End Function

    ' <summary>
    '   Gibt einen 32-Bit-Integer, der die höherwertigen 
    '   32 Bits von <paramref name="Value"/> enthält, zurück.
    ' </summary>
    ' <param name="Value">Wert, dessen High-Word berechnet werden soll.</param>
    ' <returns>High-Word von <paramref name="Value"/>.</returns>
    Public Shared Function HIWORD(ByRef Value As Int32) As Int32
        If (Value And &H80000000) = &H80000000 Then
            Return ((Value And &H7FFF0000) \ &H10000) Or &H8000
        Else
            Return (Value And &HFFFF0000) \ &H10000
        End If
    End Function

    ' <summary>
    '   Gibt einen 32-Bit-Integer, der die höherwertigen
    '    32 Bits von <paramref name="Value"/> enthält, zurück.
    ' </summary>
    ' <param name="Value">Wert, dessen High-Word berechnet werden soll.</param>
    ' <returns>High-Word von <paramref name="Value"/>.</returns>
    Public Shared Function HIWORD(ByRef Value As IntPtr) As Int32
        Return HIWORD(Value.ToInt32())
    End Function
End Class
' ##############################################################################
' ################################ MainForm.vb #################################
' ##############################################################################
Option Explicit On 
Option Strict On
Option Compare Binary

Imports System

' <remarks>
'   Hauptformular der Anwendung.
' </remarks>
Public Class MainForm
    Inherits System.Windows.Forms.Form

    Private Const WM_ACTIVATEAPP As Int32 = &H1C
    Private Const WM_ACTIVATE As Int32 = &H6

    Private Const WA_ACTIVE As Int32 = 1
    Private Const WA_CLICKACTIVE As Int32 = 2
    Private Const WA_INACTIVE As Int32 = 0


    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

        ' Prüfen, ob sich der Fokus-Status unserer Anwendung verändert hat.
        Select Case m.Msg
            Case WM_ACTIVATEAPP
                If m.WParam.Equals(IntPtr.Zero) Then
                    AddMessage( _
                        "App deactivated - Thread getting focus: " & _
                        m.LParam.ToString())
                Else
                    AddMessage( _
                        "App activated - Thread losing focus: " & _
                        m.LParam.ToString())
                End If
            Case WM_ACTIVATE
                Dim s As String
                Select Case ApiHelper.LOWORD(m.WParam)
                    Case WA_ACTIVE
                        s = "Window activated by code - " & _
                            "Window losing focus: " & m.LParam.ToString()
                    Case WA_CLICKACTIVE
                        s = "Window activated by click - " & _
                            "Window losing focus: " & m.LParam.ToString()
                    Case WA_INACTIVE
                        s = "Window loses focus - " & _
                            "Window getting focus: " & m.LParam.ToString()
                End Select

                If ApiHelper.HIWORD(m.WParam) <> 0 Then
                    s = s & " and minimized"
                End If
                AddMessage(s)
        End Select
        MyBase.WndProc(m)
    End Sub

    Private Sub AddMessage(ByVal s As String)
        Me.lstEvents.Items.Add(s)
    End Sub
End Class

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.