Kein Load-Event bei ShowWindow API

15/11/2009 - 22:18 von Udo Ewender | Report spam
Hallo zusammen,

bin gerade über ein sehr merkwürdiges Verhalten gestolpert. Wenn ich eine
Form über die ShowWindow-Methode aus der User32.dll anzeige, dann wird in
der so angezeigten Form das Load-Event nicht getriggert. Wie kann das sein?
Und vor allen Dingen... was kann ich dagegen tun? Auch Code im Shown-Event
wird nicht ausgeführt. In vb6 hat das noch funktioniert.

Folgendes Minimalbeispiel:

Public Class Form1
Private Const SW_SHOWNOACTIVATE As Integer = 4

<System.Runtime.InteropServices.DllImport("user32.dll")> _
Private Shared Function ShowWindow(ByVal hWnd As IntPtr, ByVal nCmdShow
As Integer) As Boolean
End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
ShowWindow(Form2.Handle, SW_SHOWNOACTIVATE)
End Sub
End Class

Und in Form2:
Public Class Form2
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Me.Text = "xxxxxxxxxxxx"
End Sub
End Class

Grüße.
 

Lesen sie die antworten

#1 Thorsten Doerfler
15/11/2009 - 23:28 | Warnen spam
Udo Ewender schrieb:
bin gerade über ein sehr merkwürdiges Verhalten gestolpert. Wenn ich eine
Form über die ShowWindow-Methode aus der User32.dll anzeige, dann wird in
der so angezeigten Form das Load-Event nicht getriggert. Wie kann das sein?



Nicht alle Events werden durch die Windows Nachrichten ausgelöst,
sondern sind "künstlich" im Core der Windows Forms Implementierung
herbeigerufen. Damit bekommt Dein Form nichts davon mit, wenn Du es per
ShowWindow() API anzeigst. Shown und Load werden durch Änderung der
Visible-Eigenschaft ausgelöst. Load nur beim ersten sichtbar machen des
Formulars.

Und vor allen Dingen... was kann ich dagegen tun?



Deine Initialisierungen in den Konstruktor auslagern, das HandleCreated
Ereignis verwenden oder eine öffentliche Methode erstellen, die die
Initialisierung ausführt und sowohl vom Load-Event, als auch eben von
Dir außerhalb angestoßen werden kann.

Komfortabler natürlich für den Implementierer wàre eine eigene
Show-Methode, die das Formular anzeigt, ohne es zu aktivieren:

Public Class Form2
Private Const SW_SHOWNOACTIVATE As Integer = 4

<System.Runtime.InteropServices.DllImport("user32.dll")> _
Private Shared Function ShowWindow(ByVal hWnd As IntPtr, _
ByVal nCmdShow As Integer _
) As Boolean
End Function

Public Overloads Sub Show(ByVal activate As Boolean)
If activate Then
MyBase.Show()

Else
If Not Me.IsHandleCreated Then
MyBase.CreateHandle()
End If

MyBase.OnLoad(EventArgs.Empty)

ShowWindow(Me.Handle, SW_SHOWNOACTIVATE)
End If
End Sub

Private Sub Form2_HandleCreated(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.HandleCreated
Debug.Print("Form_HandleCreated")
End Sub

Private Sub Form2_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

Debug.Print("Form_Load")
End Sub

Private Sub Form2_Shown(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Shown

Debug.Print("Form_Shown")
End Sub
End Class

Ohne Anspruch auf Vollstàndigkeit.

Thorsten Dörfler
Microsoft MVP Visual Basic

vb-hellfire visual basic faq | vb-hellfire - einfach anders
http://vb-faq.de/ | http://www.vb-hellfire.de/

Ähnliche fragen