How to make Outlook Calendar reminders stay on top in Windows 7

125

41

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.)

thursdaysgeek

Posted 2011-03-01T21:14:47.637

Reputation: 2 310

16This 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 – 2014-04-17T18:45:58.050

Answers

62

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

Gullu

Posted 2011-03-01T21:14:47.637

Reputation: 838

3I 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 – 2014-07-03T16:00:01.827

1It is not clear how I am supposed to use Gullu answer along with helios456's answer. How do I merge both? – Sun – 2014-12-10T00:51:05.490

3I changed mine to find "1 Reminder(s)" and then it worked. – Robert Brooker – 2015-05-27T01:29:12.637

1

FYI, Gullu's solution above plus helios456's addition (in the comments) was working fine for me with Outlook 2010 on Win7. But recently my work updated to Outlook 2016, and this stopped working. Fortunately I found a solution that did work, over on StackOverlow,com, http://stackoverflow.com/a/23949000/41191

– netjeff – 2017-01-04T23:06:38.203

I'm not sure how to create the certificate on Windows 10 – Jonathan Benn – 2017-05-03T17:46:27.703

Creating the certificate did not work on my env as described but this worked: https://www.groovypost.com/howto/create-self-signed-digital-certificate-microsoft-office-2016/

– rob2universe – 2017-05-08T07:10:43.940

When I replace Gullu's Application_Reminder function with helios', I get a pop-up for the first reminder so I can catch it - thanks! Subsequent reminders stay on top and can't be buried under other windows unless I minimize the window or dismiss the reminder. Changing "1 Reminder" to "1 Reminder(s)" didn't seem to work when there was only one reminder. – Chris Jenks – 2017-05-23T17:03:44.543

3i 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 – 2012-08-16T19:58:29.683

1Is the On Error Resume Next line necessary? Is there an alternative? As a programmer, the implications of that line make me cringe. – Justin Morgan – 2012-10-11T15:42:22.300

3The On Error Resume Next only applies to that Sub and just prevents the whole macro from crashing.. This is just standard VBA usage. – Jeff Martin – 2012-12-11T15:52:54.073

1Thanks Gullu, this works very well! Just a side note: PtrSafe apparently isn't supported in Office 2007. – Andreas – 2013-03-18T13:04:30.537

3I 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 ThenMsgBox "First Reminder", vbSystemModal, "" End IfmessageAlreadyShown = True

ReminderWindow = FindWindowA(vbNullString, "1 Reminder")SetWindowPos ReminderWindow, HWND_TOPMOST, 0, 0, 0, 0, FLAGS `End Sub – helios456 – 2014-02-18T12:55:15.577

@helios456 I did exactly the same thing. No one wants to miss the first meeting after a reboot. – Mario – 2014-04-17T20:25:18.827

18

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

Eric L

Posted 2011-03-01T21:14:47.637

Reputation: 1 365

+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 – 2016-09-14T21:47:53.637

1Note 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 – 2016-09-15T14:15:15.323

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 – 2017-03-30T15:30:05.433

This worked like a charm for me. AHK was the first thing I tried, but for some reason I couldn't get it to detect the window. Thanks! – Grinn – 2017-04-03T18:16:49.813

file not found can you please upload it agin? – user664174 – 2017-07-11T08:11:17.073

1

here is the compiled EXE https://drive.google.com/file/d/0B_pJVd8U0PfcWkZWNmhEYncwQjA/view

– user664174 – 2017-07-11T08:22:48.690

1Getting to the startup folder can easily be done by entering shell:startup into an address bar or the run box – Gert van den Berg – 2018-08-17T07:48:46.517

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

tommykey

Posted 2011-03-01T21:14:47.637

Reputation: 139

This worked on Outlook 2007, while Gullu's didn't. – Will Sheppard – 2014-09-24T09:50:35.927

Tried this in Outlook 2010, Windows 7 but it didn't work :( – tekumara – 2012-05-15T04:49:48.663

Used this as part of Gullu's solution. Thanks much. – Smandoli – 2012-09-28T14:16:19.547

7

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

Devil's Advocate

Posted 2011-03-01T21:14:47.637

Reputation: 1 397

3I 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.) – thursdaysgeek – 2018-06-01T18:27:06.530

2This 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. – Marc LaFleur – 2018-06-05T16:07:26.577

6

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.

Brian

Posted 2011-03-01T21:14:47.637

Reputation: 2 934

I guess the solution is to use a better tool! To bad that's not a choice for me :( – Jonathan Benn – 2017-05-03T17:26:28.847

11I work in a cube farm -- I try to keep my computer quiet for others. :( – thursdaysgeek – 2011-03-01T21:42:45.717

3If 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? – thursdaysgeek – 2011-03-01T21:44:55.243

See my answer. We finally have a solution. – Gullu – 2012-08-16T15:20:55.713

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 – 2013-08-23T12:51:41.540

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

tbone

Posted 2011-03-01T21:14:47.637

Reputation: 533

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 – 2015-03-20T13:59:55.737

@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 – 2016-04-15T19:29:23.380

@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 – 2016-04-15T19:36:16.247

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.

Mark Ransom

Posted 2011-03-01T21:14:47.637

Reputation: 2 010

Couldn't get Outlook 2013 to behave correctly even with Never Combine. Outlook 2013, Windows 7 32-bit. – Sun – 2015-04-21T23:50:50.083

This isn't a good solution for me, as I prefer to have the apps combine in the taskbar – Jonathan Benn – 2017-05-03T17:27:44.777

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...

jacorb effect

Posted 2011-03-01T21:14:47.637

Reputation: 31

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 – 2015-04-21T23:49:46.277

@Sun going to give PinMe! a shot – Chris Marisic – 2016-06-15T18:07:22.690

@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. – Chris Marisic – 2016-06-15T18:26:03.930

I tried PinMe and can't get the window to stay on top, at all!!?? – tbone – 2018-04-18T22:51:46.917

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.

user245293

Posted 2011-03-01T21:14:47.637

Reputation: 44

3Says product is $20 as of Oct 2014. – Sun – 2014-10-29T21:14:03.207

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 – 2015-11-10T10:48:53.570

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

user2635566

Posted 2011-03-01T21:14:47.637

Reputation: 167

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.

Uwe Keim

Posted 2011-03-01T21:14:47.637

Reputation: 1 747

this makes the application just blink but does not bring the notification window to the front – KIC – 2016-04-13T09:31:56.093