Abfrage: FormOnTop = true?

daDom

Erfahrenes Mitglied
Hallo!

Kann mir jemand sagen, wie ich den FormStatus abfragen kann?

Also, ich muss wissen, ob das Formluar momentan OnTop ist.
Wenn ja, soll Musik abgespoielt werden.(Das weiss ich, wies geht!)

HIIIIIIIFLE!
 
Das geht mit der API GetActiveWindow.

Dann einfach die mittels GetActiveWindow ermittelte hWnd mit der der Form vergleichen. Sind sie identisch, ist das Fenster das gerade aktive.

MfG

f0x
 
Das sagt mir ehrlich gesagt GAR NIX!

Kannst du mir Source Code liefern?

Oder nen Link?

Danke!
 
Also , ich hab bei vb@rchiv was gefunden:
Code:
 ' zunächst die benötigten API-Deklarationen
Private Declare Function GetActiveWindow Lib _
  "user32" Alias "GetActiveWindow" () As Long

Private Declare Function GetCurrentProcessId Lib _
  "kernel32" Alias "GetCurrentProcessId" () As Long

' Prüfen, ob aktuelles Formular aktiv ist oder nicht
' falls nicht, erhält das Formular den Fokus
Public Sub Form_SetFocus(ByVal hWnd As Long)
  If GetActiveWindow() <> Form.hWnd Then
    AppActivate GetCurrentProcessId()
  End If
End Sub
Beispiel
Erstellen Sie ein neues Projekt und plazieren Sie auf die Form1 ein Timer-Steuerelement. Setzen Sie die Interval-Eigenschaft auf 5000 (5 Sekunden). Fügen Sie nachfolgenden Code ein:

Private Sub Timer1_Timer()
  ' Formular aktivieren
  Form_SetFocus Me.hWnd
End Sub

Bloß ich weiß jetzt net, wie ich die Abfrage starten kann...

Wie gesagt, ich möchte abfragen, ob mein Formular gerade OnTop ist.
 
Das ist ein Code, den du nicht willst.
Er setzt das aktuelle Fenster (deiner Anwendung) immer wieder in den Vordergrund.

Müsste bei dir dann so aussehen.

Modul z.B. mdlVordergrundCheck.bas
Code:
Private Declare Function GetActiveWindow Lib _
  "user32" Alias "GetActiveWindow" () As Long
Public Function FensterImVordergrund(ByVal hWnd As Long) as Boolean
  If GetActiveWindow() == hWnd Then
    FensterImVordergrund = true
  Else
    FensterImVordergrund = false
  End If
End Function

In das Formular:
Code:
Private Sub Timer1_Timer()
  If FensterImVordergrund(Me.hwnd) = true Then
    ' Musik abspielen
  Else
    ' Musik stoppen
  EndIf
End Sub

Setze den Timer1 in die Form und setze das Interval auf z.B. 1000.
Dann überprüft dein Programm jede Sekunde, ob es noch im Vordergrund ist.
Wenn ja, soll Musik abgespielt werden.
Wenn nein, soll Musik gestoppt werden.
Du musst zum Starten der Musik dann aber noch eine Sub definieren. Im Form-Code (glaube Form_Activate)
Dann sagst du da drin, dass Musik gestartet werden soll.

edit:
War ein Fehler im Function-Aufruf.
Ist jetzt korrigiert.
 
Danke zu erst ein mal!

Ich hab aber trotzdem das problem, dass er gar net den Sound abspielt!

Hier der Code im FORMULAR :
Code:
Private Sub Timer2_Timer()
If FensterImVordergrund(Me.hWnd) = True Then
    PlayThis = True
  Else
    PlayThis = False
  End If

End Sub

Private Sub RichTextBox1_Change()
'Wenn Window minimiert, dann Sound abspielen
    If PlayThis = True Then
        sound (Int((Rnd * 3) + 1))
    End If
End Sub


Private Function sound(Zahl As Byte) As String
 Select Case Zahl
    Case 1
        Call sndPlaySound("sound/54a.wav", 1)
    Case 2
        Call sndPlaySound("sound/54b.wav", 1)
    Case 3
        Call sndPlaySound("sound/54c.wav", 1)
 End Select
End Function

und hier der Code in der topmudul.bas :
Code:
 Private Declare Function GetActiveWindow Lib _
  "user32" () As Long
Public Function FensterImVordergrund(ByVal hWnd As Long) As Boolean
  If GetActiveWindow() = hWnd Then
    FensterImVordergrund = True
  Else
    FensterImVordergrund = False
  End If
End Function

(Kann ich den Inhalt der topmudul.bas nicht auch einfach in den Formcode reinkopieren?)
 
Klar kannst du das. Übrigens ist das genau die Lösung die ich dir schon in der ersten Antwort auf deine Frage gegeben habe...

Ach ja... so wie du das im Moment hast, muss es sogar in die Form, weil du in Modulen nicht "Private" deklarieren kannst und das dann von verschiedenen Forms aufrufen..
 
Hab sie als PRIVATE deklariert...

Und ja, weils net gefunzt hat, hab ichs in die Form getan...
 
Generell: Dinge die du in Modulen hast (egal ob Funktionen, Subs, Variablen oder was auch immer) solltest du immer als öffentlich deklarieren. "Private" führt dazu, dass du es nur auf z.B. der Form verwenden kannst, in der du es Deklariert hast. Und gerade um das etwas universeller zu gestalten verwendest du doch Module!
 

Neue Beiträge

Zurück