it-swarm.com.de

Wie wird ein Outlook-Erinnerungs-Popup über anderen Fenstern erstellt?

Wie kann ein Outlook-Erinnerungsfenster über anderen Fenstern angezeigt werden?

Nachdem Sie lange online gesucht haben; Auf diese Frage konnte ich keine befriedigende Antwort finden.

Verwendung von Windows 7 und Microsoft Outlook 2007+; Wenn eine Erinnerung aufleuchtet, gibt es keine modale Box mehr, um Ihre Aufmerksamkeit zu erregen. Bei der Arbeit, bei der zusätzliche Plugins problematisch installiert werden können (Administratorrechte), und bei Verwendung eines stillen Systems werden Besprechungsanfragen häufig übersehen.

Gibt es eine einfachere Möglichkeit, dies zu implementieren als die Verwendung von Plugins/Apps von Drittanbietern?

17
Tragamor

* Das neueste Makro finden Sie in Update 3 *.

Nachdem ich eine Weile gesucht hatte, fand ich eine teilweise Antwort auf einer Website, die mir die Mehrheit der Lösung zu geben schien: https://superuser.com/questions/251963/how-to-make-Outlook-calendar -Erinnerungen-bleiben-auf-oben-in-Windows-7

Wie in den Kommentaren erwähnt, konnte die erste Erinnerung jedoch nicht angezeigt werden. während weitere Erinnerungen dann taten. Basierend auf dem Code ging ich davon aus, dass das Fenster nicht erkannt wurde, bis es einmal instanziiert wurde

Um dies zu umgehen, habe ich versucht, einen Timer zu verwenden, um in regelmäßigen Abständen zu testen, ob das Fenster vorhanden ist und wenn ja, dann bringen Sie es nach vorne. Outlook VBA - Führe jede halbe Stunde einen Code aus

Die beiden Lösungen zusammen zu verschmelzen, ergab eine funktionierende Lösung für dieses Problem.

Vom Trust Center aus habe ich die Verwendung von Makros aktiviert und dann den Visual Basic-Editor von Outlook aus geöffnet (Alt + F11). Ich fügte dem Modul 'ThisOutlookSession' den folgenden Code hinzu

Private Sub Application_Startup()
    Call ActivateTimer(5) 'Set timer to go off every 5 seconds
End Sub

Private Sub Application_Quit()
  If TimerID <> 0 Then Call DeactivateTimer 'Turn off timer upon quitting 
End Sub

Dann fügte ein Modul hinzu und fügte den folgenden Code hinzu

Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent _
As Long, ByVal uElapse As Long, ByVal lpTimerfunc As Long) As Long

Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent _
As Long) As Long

Private Declare Function FindWindowA Lib "user32" (ByVal lpClassName _
As String, ByVal lpWindowName As String) As Long

Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal _ 
hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, _
ByVal cy As Long, ByVal wFlags As Long) As Long

Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const FLAGS As Long = SWP_NOMOVE Or SWP_NOSIZE
Private Const HWND_TOPMOST = -1

Public TimerID As Long 'Need a timer ID to eventually turn off the timer. 
' If the timer ID <> 0 then the timer is running

Public Sub ActivateTimer(ByVal nSeconds As Long)
    nSeconds = nSeconds * 1000 
    'The SetTimer call accepts milliseconds, so convert from seconds
    If TimerID <> 0 Then Call DeactivateTimer 
    'Check to see if timer is running before call to SetTimer
    TimerID = SetTimer(0, 0, nSeconds, AddressOf TriggerTimer)
    If TimerID = 0 Then MsgBox "The timer failed to activate."
End Sub

Public Sub DeactivateTimer()
    Dim lSuccess As Long
    lSuccess = KillTimer(0, TimerID)
    If lSuccess = 0 Then
        MsgBox "The timer failed to deactivate."
    Else
        TimerID = 0
    End If
End Sub

Public Sub TriggerTimer(ByVal hwnd As Long, ByVal uMsg As Long, _
ByVal idevent As Long, ByVal Systime As Long)
    Call EventMacro
End Sub

Public Sub EventMacro()
    Dim ReminderWindowHWnd As Variant
    On Error Resume Next
    ReminderWindowHWnd = FindWindowA(vbNullString, "1 Reminder")
    If ReminderWindowHWnd <> 0 Then SetWindowPos ReminderWindowHWnd, _
    HWND_TOPMOST, 0, 0, 0, 0, FLAGS
    ReminderWindowHWnd = Nothing
End Sub

So, das war es; Alle 5 Sekunden prüft der Timer, ob ein Fenster mit der Bezeichnung "1 Erinnerung" vorhanden ist, und stößt dann nach oben ...


UPDATE _ ​​(12. Feb. 2015): Nachdem ich dies eine Weile verwendet hatte, fand ich einen echten Ärger darin, dass das Auslösen des Timers den Fokus vom aktuellen Wert entfernt Fenster. Es ist ein schwerer Ärger, wenn Sie eine E-Mail schreiben.

Daher habe ich den Code so aufgerüstet, dass der Timer nur alle 60 Sekunden läuft. Wenn die erste aktive Erinnerung gefunden wird, wird der Timer angehalten und die sekundäre Ereignisfunktion wird sofort zum Aktivieren der Fensterfokusänderung verwendet.

UPDATE 2 _ ​​(4 Sep 2015): Nach dem Übergang zu Outlook 2013 - dieser Code funktioniert nicht mehr für mich. Ich habe es jetzt mit einer weiteren Funktion (FindReminderWindow) aktualisiert, die nach einer Reihe von Popup-Erinnerungsbeschriftungen sucht. Dies funktioniert jetzt für mich 2013 und sollte für Versionen unter 2013 funktionieren. 

Die FindReminderWindow-Funktion nimmt einen Wert an, der die Anzahl der Iterationen ist, durch die das Fenster zu finden ist. Wenn Sie routinemäßig eine größere Anzahl von Erinnerungen als 10 Popups haben, können Sie diese Anzahl im EventMacro-Untermenü erhöhen.

Code wurde aktualisiert: Fügen Sie dem Modul 'ThisOutlookSession' den folgenden Code hinzu

Private Sub Application_Startup()
    Call ActivateTimer(60) 'Set timer to go off every 60 seconds
End Sub

Private Sub Application_Quit()
    If TimerID <> 0 Then Call DeactivateTimer 'Turn off timer upon quitting
End Sub

Private Sub Application_Reminder(ByVal Item As Object)
    Call EventMacro
End Sub

Dann der aktualisierte Modulcode ...

Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent _
As Long, ByVal uElapse As Long, ByVal lpTimerfunc As Long) As Long

Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent _
As Long) As Long

Private Declare Function FindWindowA Lib "user32" (ByVal lpClassName _
As String, ByVal lpWindowName As String) As Long

Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal _ 
hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, _
ByVal cy As Long, ByVal wFlags As Long) As Long

Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const FLAGS As Long = SWP_NOMOVE Or SWP_NOSIZE
Private Const HWND_TOPMOST = -1

Public TimerID As Long 'Need a timer ID to eventually turn off the timer. 
' If the timer ID <> 0 then the timer is running

Public Sub ActivateTimer(ByVal nSeconds As Long)
    nSeconds = nSeconds * 1000 
    'The SetTimer call accepts milliseconds, so convert from seconds
    If TimerID <> 0 Then Call DeactivateTimer 
    'Check to see if timer is running before call to SetTimer
    TimerID = SetTimer(0, 0, nSeconds, AddressOf TriggerTimer)
    If TimerID = 0 Then MsgBox "The timer failed to activate."
End Sub

Public Sub DeactivateTimer()
    Dim lSuccess As Long
    lSuccess = KillTimer(0, TimerID)
    If lSuccess = 0 Then
        MsgBox "The timer failed to deactivate."
    Else
        TimerID = 0
    End If
End Sub

Public Sub TriggerTimer(ByVal hwnd As Long, ByVal uMsg As Long, _
ByVal idevent As Long, ByVal Systime As Long)
    Call EventMacro
End Sub

Public Sub EventMacro()
    Dim ReminderWindowHWnd As Variant
    On Error Resume Next
    ReminderWindowHWnd = FindReminderWindow(10)
    If ReminderWindowHWnd <> 0 Then
        SetWindowPos ReminderWindowHWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS
        If TimerID <> 0 Then Call DeactivateTimer
    End If
    ReminderWindowHWnd = Nothing
End Sub

Private Function FindReminderWindow(iUB As Integer) As Variant
    Dim i As Integer: i = 1
    FindReminderWindow = FindWindowA(vbNullString, "1 Reminder")
    Do While i < iUB And FindReminderWindow = 0
        FindReminderWindow = FindWindowA(vbNullString, i & " Reminder(s)")
        i = i + 1
    Loop
End Function

UPDATE 3 _ ​​(08.08.2016): Nachdem ich meinen Ansatz überlegt und auf Beobachtung gestützt habe, habe ich den Code neu gestaltet, um zu versuchen, einen minimalen Einfluss auf die Arbeit zu haben, solange Outlook noch nicht funktioniert öffnen; Ich fand, dass der Timer immer noch den Fokus von den E-Mails nahm, die ich schrieb, und möglicherweise andere Probleme mit Fenstern, die den Fokus verloren haben, möglicherweise in Verbindung standen.

Stattdessen ging ich davon aus, dass das Erinnerungsfenster, sobald es instanziiert wurde, lediglich verborgen und nicht zerstört wurde, wenn Erinnerungen angezeigt wurden. Als solches behalte ich jetzt ein globales Handle für das Fenster, so dass ich nur einmal die Fenstertitel betrachten und anschließend prüfen muss, ob das Erinnerungsfenster sichtbar ist, bevor es modal gemacht wird.

Außerdem wird der Timer nur dann verwendet, wenn das Erinnerungsfenster ausgelöst wird, und nach dem Ausführen der Funktion deaktiviert wird. hoffentlich wird das störende Makro während des Arbeitstages nicht mehr ausgeführt.

Sehen Sie, welche für Sie arbeitet, denke ich ...

Code wurde aktualisiert: Fügen Sie dem Modul 'ThisOutlookSession' den folgenden Code hinzu

Private WithEvents MyReminders As Outlook.Reminders

Private Sub Application_Startup()
    On Error Resume Next
    Set MyReminders = Outlook.Application.Reminders
End Sub

Private Sub MyReminders_ReminderFire(ByVal ReminderObject As Reminder)
    On Error Resume Next
    Call ActivateTimer(1)
End Sub

Dann der aktualisierte Modulcode ...

Option Explicit

Private Declare Function SetTimer Lib "User32" (ByVal hWnd As Long, ByVal nIDEvent As Long, _
    ByVal uElapse As Long, ByVal lpTimerfunc As Long) As Long
Private Declare Function KillTimer Lib "User32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long

Private Declare Function IsWindowVisible Lib "User32" (ByVal hWnd As Long) As Long

Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName _
    As String, ByVal lpWindowName As String) As Long
Private Declare Function ShowWindow Lib "User32" (ByVal hWnd As Long, ByVal nCmdSHow As Long) As Long
Private Declare Function SetWindowPos Lib "User32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _
    ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const FLAGS As Long = SWP_NOMOVE Or SWP_NOSIZE
Private Const HWND_TOPMOST = -1

Public TimerID As Long 'Need a timer ID to turn off the timer. If the timer ID <> 0 then the timer is running
Public hRemWnd As Long 'Store the handle of the reminder window

Public Sub ActivateTimer(ByVal Seconds As Long) 'The SetTimer call accepts milliseconds
    On Error Resume Next
    If TimerID <> 0 Then Call DeactivateTimer   'Check to see if timer is running before call to SetTimer
    If TimerID = 0 Then TimerID = SetTimer(0, 0, Seconds * 1000, AddressOf TriggerEvent)
End Sub

Public Sub DeactivateTimer()
    On Error Resume Next
    Dim Success As Long: Success = KillTimer(0, TimerID)
    If Success <> 0 Then TimerID = 0
End Sub

Public Sub TriggerEvent(ByVal hWnd As Long, ByVal uMsg As Long, ByVal idevent As Long, ByVal Systime As Long)
    Call EventFunction
End Sub

Public Function EventFunction()
    On Error Resume Next
    If TimerID <> 0 Then Call DeactivateTimer
    If hRemWnd = 0 Then hRemWnd = FindReminderWindow(100)
    If IsWindowVisible(hRemWnd) Then
        ShowWindow hRemWnd, 1                                   ' Activate Window
        SetWindowPos hRemWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS   ' Set Modal
    End If
End Function

Public Function FindReminderWindow(iUB As Integer) As Long
    On Error Resume Next
    Dim i As Integer: i = 1
    FindReminderWindow = FindWindow(vbNullString, "1 Reminder")
    Do While i < iUB And FindReminderWindow = 0
        FindReminderWindow = FindWindow(vbNullString, i & " Reminder(s)")
        i = i + 1
    Loop
    If FindReminderWindow <> 0 Then ShowWindow FindReminderWindow, 1
End Function
15
Tragamor

Mit AutoHotKey können Sie festlegen, dass das Fenster immer im Vordergrund ist, ohne den Fokus des aktuellen Fensters zu stehlen. (Getestet mit WIn10/Outlook 2013)

TrayTip Script, Looking for Reminder window to put on top, , 16
SetTitleMatchMode  2 ; windows contains
loop {
  WinWait, Reminder(s), 
  WinSet, AlwaysOnTop, on, Reminder(s)
  WinRestore, Reminder(s)
  TrayTip Outlook Reminder, You have an Outlook reminder open, , 16
  WinWaitClose, Reminder(s), ,30
}
12
Eric Labashosky

Ich habe ein kostenloses Programm namens PinMe gefunden! das wird genau das tun, was ich will. Wenn Ihre Outlook-Erinnerung angezeigt wird, klicken Sie mit der rechten Maustaste auf PinMe! in der Taskleiste und wählen Sie das Erinnerungsfenster. Dadurch wird ein Schlosssymbol neben dem Fenster angezeigt. Gehen Sie voran, oder schließen Sie Ihre Erinnerung. Wenn die Erinnerung das nächste Mal erscheint, sollte sie vor jedem anderen Fenster angezeigt werden. Dies funktioniert unabhängig von Outlook im Vordergrund oder minimiert.

4
Sun

Ich habe Office 2013 und Windows 8.1 Pro. Viele Makros, die ich gefunden habe, handelten nicht mit der variablen Natur des Titels, den Outlook in dem Erinnerungsdialogfeld platziert. Wenn Sie eine Erinnerung haben, lautet der Titel "1 Erinnerung". Ich habe eine einfache Windows Forms-Anwendung in VB.NET erstellt, die ich beim Start lade und im Systemtray minimiert halte. Das Formular enthält einen 60-Timer, der den aktiven Code auslöst. Wenn mehr als 0 Erinnerungen vorhanden sind, wird das Dialogfeld auf den obersten Wert gesetzt und auf 0,0 verschoben.

Hier ist der Code:

Imports System.Runtime.InteropServices
Imports System.Text

Module Module1
    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    Public Function FindWindowEx(ByVal parentHandle As IntPtr, ByVal childAfter As IntPtr, ByVal lclassName As String, ByVal windowTitle As String) As IntPtr
    End Function

    <DllImport("user32.dll", SetLastError:=True)> _
    Public Function SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As Integer) As Boolean
    End Function

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Public Function GetWindowText(ByVal hwnd As IntPtr, ByVal lpString As StringBuilder, ByVal cch As Integer) As Integer
    End Function
End Module

Public Class Form1
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Dim titleString As String = ""

        Dim nullHandle As New IntPtr
        Dim windowHandle As New IntPtr
        Dim titleLength As Long

        Try
            Do
                Dim sb As New StringBuilder
                sb.Capacity = 512
                Dim prevHandle As IntPtr = windowHandle
                windowHandle = FindWindowEx(nullHandle, prevHandle, "#32770", vbNullString)

                If windowHandle <> 0 And windowHandle <> nullHandle Then
                    titleLength = GetWindowText(windowHandle, sb, 256)

                    If titleLength > 0 Then
                        titleString = sb.ToString

                        Dim stringPos As Integer = InStr(titleString, "Reminde", CompareMethod.Text)

                        If stringPos Then
                            Dim reminderCount As Integer = Val(Mid(titleString, 1, 2))
                            If reminderCount > 0 Then
                                Dim baseWindow As IntPtr = -1 '-1 is the topmost position
                                SetWindowPos(windowHandle, baseWindow, 0, 0, 100, 100, &H41)
                            End If
                            Exit Sub
                        End If
                    End If
                Else
                    Exit Sub
                End If
            Loop
        Catch ex As Exception
            MsgBox(ex.Message.ToString)
        End Try
    End Sub

    Private Sub ToolStripMenuItem1_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItem1.Click
        Me.Close()
    End Sub

    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        Me.Hide()
    End Sub
End Class
1
Jack

Nachdem ich mich an Eric Labashoskys Antwort inspirieren ließ, ging ich mit seinem Konzept einen Schritt weiter und erstellte die NotifyWhenMicrosoftOutlookReminderWindowIsOpen-App , die Sie kostenlos herunterladen können. Es ist eine kleine ausführbare Datei, mit der sichergestellt werden kann, dass das Outlook Reminders-Fenster über anderen Fenstern angezeigt wird, und verfügt über andere optionale Möglichkeiten, den Benutzer darauf hinzuweisen, dass das Fenster geöffnet wurde.

1
deadlydog

Outlook 2016 bietet jetzt die Option "Erinnerungen über anderen Fenstern anzeigen". Verwenden Sie Datei> Optionen> Erweitert und aktivieren Sie dann das Kontrollkästchen im Abschnitt Erinnerungen. Auf dieser support.office.com-Seite finden Sie einen Screenshot. Diese Option wurde in Version 1804 von Outlook 2016 hinzugefügt und am 25. April 2018 für den "Monatskanal" veröffentlicht.

Mit dieser Option für Outlook 2016 wird die Erinnerung anfangs nur bei allen Apps angezeigt. Ich mag keep die Erinnerung oben, bis ich sie explizit verwerfe, auch wenn ich in ein anderes Fenster klicke. Um keep die Erinnerung oben zu erhalten, empfehle ich @ Tragamors akzeptierte Antwort zu dieser Frage. Aber wenn @ Tragamors Antwort zu kompliziert erscheint und Sie mit der Erinnerung nur anfangs in Ordnung sind, ist die Option in Outlook 2016 sehr einfach.

1
netjeff

Dies sollte in verschiedenen Outlook-Versionen funktionieren, auch wenn ich es nur in Outlook 2013 getestet habe.

Da ich es nicht in einer lokalisierten englischen Version testen kann, müssen Sie möglicherweise die Codezeilen für das Durchsuchen des Erinnerungsfensters anpassen, auch wenn ich in meiner Antwort die zugehörigen Codezeilen geändert habe, um das Fenster in der lokalisierten englischen Version zu finden.

Lassen Sie mich wissen, ob das Makro in Ihrer englischen Outlook-Version funktioniert.

Dem Benutzer steht es frei, das Erinnerungsfenster zu minimieren oder zu schließen. Wenn eine neue oder bereits vorhandene Erinnerung ausgelöst wird, wird das Erinnerungsfenster oben angezeigt und nicht aktiviert.

Der Titel des Erinnerungsfensters wird immer aktualisiert, wobei die tatsächliche Anzahl der sichtbaren Erinnerungen auch ohne Aktivierung angezeigt wird.

In allen Fällen stiehlt das Erinnerungsfenster niemals den Fokus, es sei denn, das Vordergrundfenster ist offensichtlich das Erinnerungsfenster, d. H. Es sei denn, der Benutzer hat das Erinnerungsfenster absichtlich ausgewählt.

Dieses Makro wählt nicht nur das Erinnerungsfenster als oberstes Fenster aus, sondern wählt auch die letzte Erinnerung im Erinnerungsfenster selbst aus. Sie können dieses Verhalten anpassen. Lesen Sie den Code, um dies tun zu können.

Das Makro blinkt auch im Erinnerungsfenster, wenn das Fenster zum ersten Mal angezeigt wird und immer wenn eine neue oder vorhandene Erinnerung erneut ausgelöst wird.

Sie können anpassen, wie oft das Fenster blinkt oder mit anderen Parametern in Verbindung steht. Es sollte klar sein, wie dies geschieht.

Fügen Sie die nächsten Codezeilen in das Klassenmodul 'ThisOutlookSession' ein:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, _
                                                    ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function FlashWindowEx Lib "user32" (FWInfo As FLASHWINFO) As Boolean

Private Const FLASHW_STOP = 0
Private Const FLASHW_CAPTION = 1
Private Const FLASHW_TRAY = 2
Private Const FLASHW_ALL = FLASHW_CAPTION Or FLASHW_TRAY
Private Const FLASHW_TIMER = 4
Private Const FLASHW_TIMERNOFG = 12

Private Type FLASHWINFO
    cbSize As Long
    hwnd As Long
    dwFlags As Long
    uCount As Long
    dwTimeout As Long
End Type

Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2
Private Const HWND_TOP = 0
Private Const HWND_BOTTOM = 1
Private Const SWP_NOSIZE = 1
Private Const SWP_NOMOVE = 2
Private Const SWP_NOACTIVATE = 16
Private Const SWP_DRAWFRAME = 32
Private Const SWP_NOOWNERZORDER = 512
Private Const SWP_NOZORDER = 4
Private Const SWP_SHOWWINDOW = 64

Private Existing_reminders_window As Boolean

Private WithEvents Rmds As Reminders

Public Reminders_window As Long

Private Sub Application_Reminder(ByVal Item As Object)
    If Existing_reminders_window = False Then
        Set Rmds = Application.Reminders
        'In order to create the reminders window
        ActiveExplorer.CommandBars.ExecuteMso ("ShowRemindersWindow")
        Reminders_window = FindWindow("#32770", "0 Reminder(s)")
        If Reminders_window = 0 Then
            Reminders_window = FindWindow("#32770", "0 Reminder")
            If Reminders_window = 0 Then
                Reminders_window = FindWindow("#32770", "0 Reminder ")
            End If      
        End If
        'To prevent stealing focus in case Outlook was in the foreground
        ShowWindow Reminders_window, 0
        SetWindowPos Reminders_window, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE Or SWP_NOACTIVATE
        Existing_reminders_window = True
    End If
End Sub
Private Sub Rmds_BeforeReminderShow(Cancel As Boolean)
    Dim FWInfo As FLASHWINFO
    If Existing_reminders_window = True Then
        Cancel = True
        With FWInfo
             .cbSize = 20
             .hwnd = Reminders_window
             .dwFlags = FLASHW_CAPTION
             .uCount = 4
             .dwTimeout = 0
        End With
        'In case the reminders window was not the highest topmost. This will not work on Windows 10 if the task manager window is topmost, the task manager and some other system windows have special z position
        SetWindowPos Reminders_window, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE Or SWP_NOACTIVATE
        ShowWindow Reminders_window, 4
        Select_specific_reminder
        FlashWindowEx FWInfo
    End If
End Sub

Fügen Sie die nächsten Codezeilen in ein neues oder ein vorhandenes Standardmodul ein:

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

Private Const WM_CHAR = &H102
Private Const VK_HOME = &H24
Private Const VK_END = &H23
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101

Public Sub Select_specific_reminder()
    Dim Retval As Long
    Retval = EnumChildWindows(ThisOutlookSession.Reminders_window, AddressOf EnumChildProc, 0)
End Sub
Private Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
    Dim Nome_classe As String
    Nome_classe = Space$(256)
    GetClassName hwnd, Nome_classe, 256
    If InStr(Nome_classe, "SysListView32") Then
    'You can customize the next code line in order to select a specific reminder
        SendMessage hwnd, WM_KEYDOWN, VK_HOME, ByVal 0&
    End If
    EnumChildProc = 1
End Function
0
Evolve_or_Die

Nur Alt F11 und kopieren Sie diesen Code einfügen .. Arbeitet für mich

Option Explicit

Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowText Lib "User32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "User32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long
Private Declare Function GetWindow Lib "User32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Private Declare Function IsWindowVisible Lib "User32" (ByVal hWnd As Long) As Boolean

Private Const GW_HWNDNEXT = 2

Private Declare PtrSafe Function FindWindowA Lib "User32" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare PtrSafe Function SetWindowPos Lib "User32" ( _
ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _
ByVal X As Long, ByVal Y As Long, ByVal cx As Long, _
ByVal cy As Long, ByVal wFlags As Long) As Long

Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const FLAGS As Long = SWP_NOMOVE Or SWP_NOSIZE
Private Const HWND_TOPMOST = -1

Private Sub Application_Reminder(ByVal Item As Object)
Dim ReminderWindowHWnd As Variant
On Error Resume Next
  Dim lhWndP As Long
    If GetHandleFromPartialCaption(lhWndP, "Reminder") = True Then
        SetWindowPos lhWndP, HWND_TOPMOST, 0, 0, 0, 0, FLAGS
    End If

End Sub

Private Function GetHandleFromPartialCaption(ByRef lWnd As Long, ByVal sCaption As String) As Boolean

     Dim lhWndP As Long
        Dim sStr As String
        GetHandleFromPartialCaption = False
        lhWndP = FindWindow(vbNullString, vbNullString) 'PARENT WINDOW
        Do While lhWndP <> 0
            sStr = String(GetWindowTextLength(lhWndP) + 1, Chr$(0))
            GetWindowText lhWndP, sStr, Len(sStr)
            sStr = Left$(sStr, Len(sStr) - 1)
            If InStr(1, sStr, sCaption) > 0 Then
                GetHandleFromPartialCaption = True
                lWnd = lhWndP
                Exit Do
            End If
            lhWndP = GetWindow(lhWndP, GW_HWNDNEXT)
        Loop
     End Function
0
Gullu

Das neueste Outlook verfügt über diese Funktion und das gleiche wird in https://superuser.com/a/1327856/913992

0