Lostfocus für Formular

von Jens Müller » Sonntag, 19. März 2006



Guten Tag,

Weder das Ereignis LostFocus, noch Deactivate eines Formulars wird
aufgerufen, wenn der Eingabefocus, z.b. durch Klicken auf eine andere
Anwendung gesetzt wird.
Gibt es eine Möglichkeit herauszufinden, wann die eigene Anwendung
nicht mehr den Eingabefocus hat?

Grüße,
Jens




Re: Lostfocus für Formular

von Thorsten Doerfler » Sonntag, 19. März 2006






Das LostFocus-Ereignis für ein Formular ist nur dann von Bedeutung,
wenn keine weiteren Steuerelemente auf dem Formular vorhanden sind.
Das Deactivate-Ereignis tritt nur ein, wenn zwischen Formularen
*innerhalb* der Anwendung gewechselt wird.


Erkennst Du durch Subclassing der Nachricht WM_ACTIVATEAPP. Ist wParam
'False' bzw. '0', wurde in eine andere Anwendung gewechselt.

Was ist SubClassing - und wie nutzt man es?
http://vb-tec.de/subclass.htm

Subclassing Without The Crashes
http://www.vbaccelerator.com/home/VB/Code/Libraries/Subclassing/SSubTimer/article.asp

Thorsten Dörfler
--
vb-hellfire - einfach anders
http://www.vb-hellfire.de/



Re: Lostfocus für Formular

von Herfried K. Wagner [MVP] » Sonntag, 19. März 2006



Hallo Jens!



<URL: http://dotnet.mvps.org/vb/samples/misc/ #AppActivate>

--
M S Herfried K. Wagner
M V P <URL: http://dotnet.mvps.org/> ;
V B <URL: http://classicvb.org/petition/> ;




Re: Lostfocus für Formular

von Peter Götz » Sonntag, 19. März 2006



Hallo Jens,


Ja, gibt es.
Kleines Beispiel:

1 leere Form: Form1

' /// Code in Form1
Option Explicit

Public Sub GotAppFocus()
' Hier Code einfügen, der ausgeführt werden soll, _
wenn von einer anderen Anwendung zu dieser _
zurückgekehrt worden ist.

Me.Caption = "GotAppFocus"
End Sub

Public Sub LostAppFocus()
' Hier Code einfügen, der ausgeführt werden soll, _
wenn zu einer anderen Anwendung gewechselt wird.

Me.Caption = "LostAppFocus"
End Sub

Sub Form_Load()
' SubClassing für diese Form aktivieren
SubClass Me.hWnd, True
End Sub

Private Sub Form_Unload(Cancel As Integer)
' SubClassing für diese Form beenden
SubClass Me.hWnd, False
End Sub

' /// Code in Standardmodul *.bas
Option Explicit

Private Declare Function CallWindowProc _
Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, _
ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

Private Declare Function SetWindowLong _
Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long

Private Const WM_ACTIVATEAPP = &H1C
Private Const GWL_WNDPROC = -4

Private mOrgWndProc As Long

Public Sub SubClass(hWnd As Long, SubClassActivate As Boolean)

If SubClassActivate Then
' SubClassing aktivieren
mOrgWndProc = SetWindowLong(hWnd, GWL_WNDPROC, _
AddressOf WindowProc)
Else
' SubClassing beenden
SetWindowLong hWnd, GWL_WNDPROC, mOrgWndProc
End If
End Sub

Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long

' diese Prozedur erhält die umgeleiteten Fensternachrichten _
bevor sie am Prozedurende zur Original-Fensterprozedur _
weitergegeben werden.

Dim F As Form
For Each F In Forms
If F.hWnd = hWnd Then
Exit For
End If
Next

If uMsg = WM_ACTIVATEAPP Then
' Prüfen ob die Anwendung den Focus erhalten hat
If wParam <> 0 Then
' Anwendung hat Focus erhalten, _
GotAppFocus in der betroffenen Form aufrufen
F.GotAppFocus
Else
' Anwendung hat Focus verloren, _
LostAppFocus in der betroffenen Form aufrufen
F.LostAppFocus
End If
End If

' Nachrichten an Original-Fensterprozedur weitergeben
WindowProc = CallWindowProc(mOrgWndProc, hWnd, uMsg, wParam, lParam)
End Function

' \\\ E N T E


Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tips u. Beispielprogrammen)




Re: Lostfocus für Formular

von Jens Müller » Sonntag, 19. März 2006



>> Gibt es eine Möglichkeit herauszufinden, wann die eigene Anwendung

Danke! Das hatte ich gebraucht.

Grüße,
Jens




If you have any questions, you can contact us: admin#mofeel.net     Spam Report