129

I'm just starting to use Windows 7 and I want to know how to make my Outlook reminders pop up and show themselves prominently. They keep opening discreetly, as just another window in the Outlook stack on the taskbar. As a result, I keep overlooking them because they pop up behind everything else.

How do I make them less easy to overlook?

(Clearly, one usually doesn't want obnoxious apps that push themselves to the forefront. But there are a few places where such behavior is desirable, and Outlook calendar reminders are one of them.)

1
  • 18
    This is so necessary. If one falls into intense concentration it's very easy to miss a reminder and notice it buried under other windows only after you're late. It's ridiculous that it's not possible with some simple setting. What good is a reminder if you don't get it promptly?!
    – Mario
    Apr 17, 2014 at 18:45

11 Answers 11

63

I had the same problem with Outlook 2010. Use the steps mentioned below, it works like a charm. Don't forget to enable all macros: Trust Center > Macro Settings.

  • Create a Digital certificate for later: Hit Start and type 'certificate', select 'Digital Certificate for VBA Projects'
  • Enter a name for your certificate. Click OK. Open Outlook and hit Alt + F11 to start the VBA editor.
  • In the tree on the left, expand 'Microsoft Office Outlook Objects' and double click on 'ThisOutlookSession'
  • Paste in this code:

    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
    ReminderWindowHWnd = FindWindowA(vbNullString, "1 Reminder")
    SetWindowPos ReminderWindowHWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS
    
    End Sub
    
  • Sign the Macro so it will run: Tools > Digital Signature... and choose the certificate you created earlier

  • Close the VBA window
  • Enable all macros in File > Options > Trust Center > Trust Center Settings > Macro Settings
13
  • 3
    i noticed , sometimes (normally when you start Outlook) the first reminder will not stay on top. Once you click Dismiss and close the reminder all subsequent reminders stay on top. Dont know why.
    – Gullu
    Aug 16, 2012 at 19:58
  • 3
    The On Error Resume Next only applies to that Sub and just prevents the whole macro from crashing.. This is just standard VBA usage. Dec 11, 2012 at 15:52
  • 3
    I had the same issue as Gullu indicated in his first comment. In order to work around that, I show a message box for the first reminder after restarting outlook (or my computer). Private messageAlreadyShown As Boolean Private Sub Application_Reminder(ByVal Item As Object) On Error Resume Next If Not messageAlreadyShown Then MsgBox "First Reminder", vbSystemModal, "" End If messageAlreadyShown = True ReminderWindow = FindWindowA(vbNullString, "1 Reminder") SetWindowPos ReminderWindow, HWND_TOPMOST, 0, 0, 0, 0, FLAGS End Sub
    – helios456
    Feb 18, 2014 at 12:55
  • 3
    I had trouble finding the tool to create a self-signed cert for the macro. I found it in C:\Program Files\Microsoft Office\OfficeXX, the tool SELFCERT.EXE.
    – SSZero
    Jul 3, 2014 at 16:00
  • 3
    I changed mine to find "1 Reminder(s)" and then it worked. May 27, 2015 at 1:29
21

AutoHotKey can also be used to solve this. This script will put the reminder window on top without stealing focus (tested with 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
}

AHK Script - Compiled EXE

8
  • +1 for using AHK. I just tested this in win 7 / outlook 2016. It brings the view to the front but it doesn't actually steal the focus if you are typing. Exactly what I wanted! (I just removed the tray tips though :) )
    – Fawix
    Sep 14, 2016 at 21:47
  • 1
    Note that there is a very easy way to have the script start with windows. Just put it on the folder C:\Users\<username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
    – Fawix
    Sep 15, 2016 at 14:15
  • The AHK Script and Compiled EXE links are broken. I copied and pasted the script above into my AutoHotKey.ahk script and it did not work.
    – Mike Cole
    Mar 30, 2017 at 15:30
  • 1
    here is the compiled EXE drive.google.com/file/d/0B_pJVd8U0PfcWkZWNmhEYncwQjA/view
    – user664174
    Jul 11, 2017 at 8:22
  • 1
    Getting to the startup folder can easily be done by entering shell:startup into an address bar or the run box Aug 17, 2018 at 7:48
13

The best answer I've found is here: How to get Outlook appointment reminders to pop up in front of other windows again using some simple VBA.

It entails adding a few lines of simple VBA code to "ThisOutlookSession". Now, it pops up a window every time. Much better.

  • Create a Digital certificate for later
  • Hit Start and type ‘certificate’, select ‘Digital Certificate for VBA Projects’
  • Enter a name for your certificate
  • Done
  • Open Outlook and hit Alt + F11 to start the VBA editor.
  • In the tree on the left, expand ‘Microsoft Office Outlook Objects' and double click on ‘ThisOutlookSession’
  • Paste in this code, modifying the text in quotes to suit your preferences. Leave the quotes in.

    Private Sub Application_Reminder(ByVal Item As Object)
    
    
        If TypeOf Item Is AppointmentItem Then
        MsgBox "Message text", vbSystemModal, "Message title"
        End If
    
    
    End Sub
    
  • Sign the Macro so it will run by going to Tools > Digital Signature… and choosing the certificate you created earlier

  • Close the VBA window
3
  • Tried this in Outlook 2010, Windows 7 but it didn't work :(
    – tekumara
    May 15, 2012 at 4:49
  • Used this as part of Gullu's solution. Thanks much.
    – Smandoli
    Sep 28, 2012 at 14:16
  • This worked on Outlook 2007, while Gullu's didn't. Sep 24, 2014 at 9:50
8

As of Version 1803 (February 2018), the "Show reminders on top of other windows" option is now available. It does not appear to be enabled by default.

enter image description here

4
  • 3
    I don't have the updated version yet, but this is great! And it's only been 7 years since I asked, too. (And that's a dis at MS, as well as a thanks to you.) Jun 1, 2018 at 18:27
  • 2
    This is an excellent update to an old question. Note that this isn't quite the same as "always on top", but it does ensure the window does pop at the top of the z-order so users are less likely to miss it. Jun 5, 2018 at 16:07
  • I do not have this option in Version 1808 (build 10361.20002 Office "start in one click") from Office Professional 2019 :-( Jun 25, 2020 at 15:29
  • I'm running Outlook for Microsoft 365 (16.0.12827.20328) and I still have the option. Weird. Jun 25, 2020 at 21:53
6

Same as Gullu's anwer above but with change to accommodate different window title:

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

'// TO ACCOUNT FOR WINDOW TITLE CHANGING WITH NOTIFICATION COUNT:
Private Sub Application_Reminder(ByVal Item As Object)
    Dim ReminderWindowHWnd As Variant
    'On Error Resume Next
    On Error GoTo err
    'Loop 25 times as FindWindowA needs exact title which varies according to number of reminder items...
    Dim iReminderCount As Integer
    For iReminderCount = 1 To 25
        'Try two syntaxes...
        ReminderWindowHWnd = FindWindowA(vbNullString, iReminderCount & " Reminder"): SetWindowPos ReminderWindowHWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS
        ReminderWindowHWnd = FindWindowA(vbNullString, iReminderCount & " Reminder(s)"): SetWindowPos ReminderWindowHWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS
    Next
Exit Sub
err:
    Debug.Print err.Number & " - " & err.Description & " (iReminderCount = " & iReminderCount & ")"
    Resume Next
End Sub
3
  • Even better would be something like Dim olApp As Outlook.Application Set olApp = New Outlook.Application iReminderCount = olApp.Reminders.Count Then you could remove the loop.
    – Zusukar
    Mar 20, 2015 at 13:59
  • @Zusukar Reminders.Count returns the total number of reminders set in appointments, not in the active reminder dialog In my system this returns 22, for example.
    – Geoff
    Apr 15, 2016 at 19:29
  • @Zusukar You could ideally use the Reminder.IsVisible property to count the visible ones, but this is always false - presumably the event happens before the reminder is marked as visible.
    – Geoff
    Apr 15, 2016 at 19:36
5

There is no way. Our company tried escalating it to Microsoft directly. One thing people do here is assign it a more obnoxious sound, to help notice it. But Microsoft has told us it is by design.

5
  • 11
    I work in a cube farm -- I try to keep my computer quiet for others. :( Mar 1, 2011 at 21:42
  • 3
    If they were truly designing, they would make it that way by default, but allow it to be changed. They "design", we learn to put up with it? Mar 1, 2011 at 21:44
  • See my answer. We finally have a solution.
    – Gullu
    Aug 16, 2012 at 15:20
  • I did find a third party solution. Actual Tools Actual Window Guard $30 (which is also included in their all encompassing product Actual Windows Manager $50) allows for assigning windows to always be on top. Plus its easy to turn the feature on and off. (note it does more than just that to help make the price tag easier to accept.) I found these when trying out virtual desktop & multi-monitor utility tools. I've been using the latter for a couple of months now and am very happy with it.
    – Javaru
    Aug 23, 2013 at 12:51
  • I guess the solution is to use a better tool! To bad that's not a choice for me :( May 3, 2017 at 17:26
3

This was bugging me too. After some intense searching I found a partial answer: http://www.pcreview.co.uk/forums/hidden-outlook-reminders-t3972914.html

If you change the "Taskbar buttons" setting under the "Taskbar and Start Menu Properties" to "Never combine," then the grouping separates and the reminder pops-up in front of whatever else you have open.

I tried to test it and found that it was inconsistent; one time it stayed hidden behind what I was working on, and another time it popped up front. In both cases there was an icon on the task bar that looked different from Outlook itself, so there was at least a chance that I would notice it.

2
  • Couldn't get Outlook 2013 to behave correctly even with Never Combine. Outlook 2013, Windows 7 32-bit.
    – Sun
    Apr 21, 2015 at 23:50
  • This isn't a good solution for me, as I prefer to have the apps combine in the taskbar May 3, 2017 at 17:27
3

I used Filebox eXtender and when the first reminder comes in I open it and click the new 'pin' icon at the top right of the caption bar. Then when the next reminder comes in, it comes in the foreground...

4
  • PinMe! will do the same. It is a free portable tool and does this one task extremely well. I've tested it Outlook 2013 and it works exactly as I want it. Outlook foreground or minimized, the calendar reminder always pops to the front.
    – Sun
    Apr 21, 2015 at 23:49
  • @Sun going to give PinMe! a shot Jun 15, 2016 at 18:07
  • @Sun i setup "super pin" on the notification window that should make sure it is always perpetually visible no matter what until i dismiss it. Works as advertised out of box, and it delivers on successive notifications. awesome. Jun 15, 2016 at 18:26
  • I tried PinMe and can't get the window to stay on top, at all!!??
    – tbone
    Apr 18, 2018 at 22:51
1

I found an addin called ShowReminders (http://www.sagelamp.com/pages/showreminders.aspx), which brings the reminders window to the top. It even works when you minimize the reminder window.

2
  • 3
    Says product is $20 as of Oct 2014.
    – Sun
    Oct 29, 2014 at 21:14
  • Setup fails for me on Windows 10: The following package files could not be found: C:\Users\ukeim\AppData\Local\Temp\IXP000.TMP\Office2007PIARedist\o2007pia.msi
    – Uwe Keim
    Nov 10, 2015 at 10:48
0

I finally find a simple solution using Outlook VBA and a simple EXE.

Here is how to never missed outlook meeting appointment again.

Why a stand alone exe application just for this purpose? Well I had the the big red box embeded in the VBA, but that solution was full of problem (I believe it is because I have to use hwnd and other unusual system property to keep the big red box on top) . So to make things simpler why not a basic EXE that do one thing. You can use free tools from microsoft (Visual studio Community 2015 is free).

This is the EXE code. simple windows form application with one form. Compile this code.

Imports System.Timers
Public Class Form1
    Dim tTimer As New Timer
    Public Sub New()
        InitializeComponent()
        Me.StartPosition = Windows.Forms.FormStartPosition.CenterScreen
        Me.TopMost = True
        Me.TopLevel = True
    End Sub
    Private Sub Form1_DoubleClick(sender As Object, e As EventArgs) Handles Me.DoubleClick
        Application.Exit()
    End Sub 
    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        flashingQuick()
    End Sub
    Sub flashingQuick()
        tTimer.Start()
        AddHandler tTimer.Elapsed, New ElapsedEventHandler(AddressOf TimerTick)
    End Sub
    Sub TimerTick(ByVal source As [Object], ByVal e As ElapsedEventArgs)
        Dim theTimer As System.Timers.Timer = DirectCast(source, System.Timers.Timer)
        theTimer.Interval = 500
        theTimer.Enabled = True
        If Me.BackColor = System.Drawing.SystemColors.Control Then
            Me.BackColor = Color.Red
        Else
            Me.BackColor = System.Drawing.SystemColors.Control
        End If
    End Sub
End Class

And this is all I need in the outlook VBA. Put this in ThisOutlookSession

Private Sub Application_Reminder(ByVal Item As Object)
    On Error Resume Next
    If Item.MessageClass <> "IPM.Appointment" Then
      Exit Sub
    End If
    Dim sAPPData As String
    Dim sFileName As String
    sAPPData = Environ("AppData")
    sFileName = "\Microsoft\Windows\Start Menu\Programs\BigRedBox\BigRedBox.exe"
    If Dir(sAPPData & sFileName) <> "" Then
        Call Shell(sAPPData & sFileName)
    End If
End Sub
0

This is an enhanced version of tbone's answer which works on German versions.

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 Declare PtrSafe Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Boolean
Private Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Boolean
Private Declare PtrSafe Function SetFocus Lib "user32" (ByVal hwnd 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 GoTo err
    'Loop 25 times as FindWindowA needs exact title which varies according to number of reminder items...
    Dim iReminderCount As Integer
    For iReminderCount = 1 To 25
        'Try two syntaxes...

        ReminderWindowHWnd = FindWindowA(vbNullString, iReminderCount & " Erinnerung")
        SetWindowPos ReminderWindowHWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS
        BringWindowToTop (ReminderWindowHWnd)
        SetForegroundWindow ReminderWindowHWnd
        SetFocus ReminderWindowHWnd

        ReminderWindowHWnd = FindWindowA(vbNullString, iReminderCount & " Erinnerung(en)")
        SetWindowPos ReminderWindowHWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS
        BringWindowToTop ReminderWindowHWnd
        SetForegroundWindow ReminderWindowHWnd
        SetFocus ReminderWindowHWnd
    Next
Exit Sub
err:
    Debug.Print err.Number & " - " & err.Description & " (iReminderCount = " & iReminderCount & ")"
    Resume Next
End Sub

I've added German window titles and also some new functions (BringWindowToTop, SetForegroundWindow and SetFocus).

Works on my German Windows 10 together with Outlook 2016.

I did not manage to generate a new certificate (pressing Start and entering "certificate" revealed nothing), but simply selected another certificate in the list when signing.

1
  • this makes the application just blink but does not bring the notification window to the front
    – KIC
    Apr 13, 2016 at 9:31

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .