Minimieren/Maximieren erkennen

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: Minimieren/Maximieren erkennen
von: Marcus Kempf
Geschrieben am: 15.09.2015 08:50:17

Hallo,
ich suche eine Möglichkeit zu erfassen wann ein Excel-Fenster minimiert/maximiert/wiederhergestellt wird.
Dazu gibt es doch sicherlich auch eine passende API-Lösung oder Nepumuk?
Danke im Voraus.
Marcus

Bild

Betrifft: AW: Minimieren/Maximieren erkennen
von: Nepumuk
Geschrieben am: 15.09.2015 09:56:29
Hallo,
was hast du denn vor?
Gruß
Nepumuk

Bild

Betrifft: AW: Minimieren/Maximieren erkennen
von: Marcus Kempf
Geschrieben am: 15.09.2015 10:02:41
Ich möchte erkennen, wann ein Excel-Fenster minimiert/maximiert/wiederhergestellt wird.
Auch hier geht es wieder um den IdleTimer, den ich nebenbei gesagt bereits bewerkstelligt habe, entgegen der Meinung hier im Forum, dass dies nicht möglich sei.
Er soll nun um die Möglichkeit erweitert werden, dass nicht nur eine Inaktivität den Timer auslöst, sondern auch der Umstand, dass die Excelmappe minimiert geöffnet und ungenutzt tagelang vor sich hinvegitiert.

Bild

Betrifft: AW: Minimieren/Maximieren erkennen
von: Nepumuk
Geschrieben am: 15.09.2015 10:13:01
Hallo,
teste es erst mal in einer neuen Mappe bevor du es in deine Produktivmappe einbaust.
In Excel 2013 wird beim Wiederherstellen des Fensters immer "normal" zurückgegeben auch wenn es maximiert ist. Das war in den Vorgängerversionen nicht so, aber Microsoft hat in 2013 das Fensterhandle geändert. Dagegen kann ich nichts machen.
Wenn du aber sowieso einen Timer am laufen hast, warum baust du die Abfrage nach "Application.WindowState" nicht mit da ein?

' **********************************************************************
' Modul: DieseArbeitsmappe Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If Not Saved Then
        Select Case MsgBox("Sollen Ihre Änderungen in '" & Name & _
                    "' gespeichert werden", vbExclamation Or vbYesNoCancel)
            Case vbYes
                Save
            Case vbNo
                Saved = True
            Case vbCancel
                Cancel = True
        End Select
    End If
    If Not Cancel Then UnHookMe
End Sub

Private Sub Workbook_Open()
    Call Application.OnTime(EarliestTime:=Now, Procedure:=" HookMe")
End Sub

' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit
Option Private Module

Private Declare PtrSafe Function SetWindowsHookExA Lib "user32.dll" ( _
    ByVal idHook As Long, _
    ByVal lpfn As LongPtr, _
    ByVal hmod As LongPtr, _
    ByVal dwThreadId As Long) As LongPtr
Private Declare PtrSafe Function CallNextHookEx Lib "user32.dll" ( _
    ByVal hHook As LongPtr, _
    ByVal ncode As Long, _
    ByVal wParam As LongPtr, _
    ByRef lParam As Any) As LongPtr
Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32.dll" ( _
    ByVal hHook As LongPtr) As Long
Private Declare PtrSafe Function GetWindowThreadProcessId Lib "user32.dll" ( _
    ByVal hwnd As LongPtr, _
    ByRef lpdwProcessId As Long) As Long

Private Const HCBT_MINMAX As Long = 1
Private Const WH_CBT As Long = 5

Private llngptrHookID As Long

Public Sub HookMe()
    Dim lngProcessID As Long
    lngProcessID = GetWindowThreadProcessId(Application.hwnd, 0&)
    llngptrHookID = SetWindowsHookExA(WH_CBT, AddressOf Hook, Application.Hinstance, lngProcessID)
End Sub

Public Sub UnHookMe()
    Call UnhookWindowsHookEx(llngptrHookID)
End Sub

Private Function Hook(ByVal ncode As Long, ByVal wParam As LongPtr, ByVal lParam As Long) As LongPtr
    If ncode = HCBT_MINMAX Then Call WindowResize(lParam)
    Hook = CallNextHookEx(llngptrHookID, ncode, wParam, ByVal lParam)
End Function

Private Sub WindowResize(ByVal lParam As Long)
    Select Case lParam
        Case 3: MsgBox "Maximiert"
        Case 6: MsgBox "Minimiert"
        Case 9: MsgBox "Normal"
        Case Else: MsgBox "Ooops"
    End Select
End Sub

Gruß
Nepumuk

Bild

Betrifft: AW: Minimieren/Maximieren erkennen
von: Marcus Kempf
Geschrieben am: 15.09.2015 10:20:06
Eine Windowstate-Änderung soll mir einen 2. Timer starten.
Der erste Timer vergleicht die festgelegte IdleTime mit der aktuell inaktiven Zeit.
Da bei minimiertem Fenster die Inaktivität auf Windowsebene aber unberücksichtigt bleiben soll, möchte ich dies über einen 2. Timer realisieren.

Bild

Betrifft: IdleTimer fertig gestellt
von: Marcus Kempf
Geschrieben am: 15.09.2015 13:28:25
Da dank Nepumuks Hilfe nun alles wie gewünscht läuft, habe ich mich entschlossen euch das Ergebnis nicht vorzuenthalten.
Folgende Funktionen sind hier realisiert:
- Die gewünschte Inaktivitätszeit (Nur Zahleneingaben > 0 zulässig), sowie der Speicherstatus können über das Menu Add-Ins-->Einstellungen festgelegt werden,
- Hier kann auch das Passwort zur Dateikonfiguration geändert werden.
Die Datei Speichert (je nach Speicherstatus) und schließt sich nach der definierten Zeit in den folgenden Fällen selbsttätig:
- Keine Zelle angewählt, Editiermodus inaktiv, für gewünschte Zeit keine Tastatur- oder Mauseingabe,
- Zelle angewählt, Editiermodus aktiv, für gewünschte Zeit keine Tastatur- oder Mauseingabe,
- Fenster für gewünschte Zeit minimiert, unabhängig von Tastatur- oder Mauseingabe.
Um die Zeit in Minuten eingeben zu lassen, muss in der Form frmEinstellungen jeweils der _ Kommentar bei


...' / 60...

und
...' * 60...

entfernt werden.
Das Passwort, soweit benötigt lautet 1234.
https://www.herber.de/bbs/user/100191.xlsm
Vielleicht kann irgendjemand ja mal einen Nutzen daraus ziehen.
Gruß und Dank
Marcus

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Minimieren/Maximieren erkennen"