Making Sure Outlook Calendar Reminders Actually Pop-up in Windows 7


Introduction #

In Windows 7, MS Outlook seems to be horribly bad at popping up calendar reminders when outlook doesn't have focus. This can cause a series of problems from minor annoyances to missed meetings. As discussed in this StackExchange question, there are some relatively easy work-arounds to this issue that I'll elaborate on here. If you've never used Outlook's VBA editor to extend it's capabilities before, this article will take you through how to set up everything you'll need to do, start to finish. If you're already familiar with using VBA in Outlook, then you can just skip to Step 5 and paste in the code and you'll be all set.

Step By Step #

  1. Hit the Windows Key and type "certificate"

    digital certificate for vba projects

  2. Select Digital Certificate for VBA Projects and type in a name for your certificate and hit OK

    create digital certificate

  3. Open Outlook 2010 and Hit Alt + F11 to start the VBA editor

  4. In the Project Pane on the left, Expand Project1 > Microsoft Outlook Objects > and double click on ThisOutlookSession

    Microsoft VBA

  5. Paste in the following code exactly:

    'Declare Functions From User32 Library
    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
    'Declare Constants
    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
    'Only show the message the first time
    Private messageAlreadyShown As Boolean
    'Finds Reminder Window and Brings to TopMost position
    Private Sub Application_Reminder(ByVal Item As Object)
    On Error Resume Next
    'show message box for first reminder
    If Not messageAlreadyShown Then
          MsgBox "First Reminder", vbSystemModal, ""
          messageAlreadyShown = True
    End If
    'find reminder window
    ReminderWindow = FindWindowA(vbNullString, "1 Reminder")
    'bring reminder window to front
    SetWindowPos ReminderWindow, HWND_TOPMOST, 0, 0, 0, 0, FLAGS
    End Sub
  6. Sign the Macro by going to Tools > Digital Signature and clicking Choose

    digital signature

  7. Select the certificate you created earlier and hit OK

    select certificate

  8. Select OK again, hit Ctrl + S to save and exit the VBA window

  9. To Enable Macros, Go to File > Options and select Trust Center from the left window

    outlook > trust center

  10. Run the Trust center by clicking the Trust Center Settings button on the right.

  11. From the Trust Center, select Macro Settings, and select "Notifications for digitally signed macros, all other macros disabled" and hit OK

    macro settings

  12. Exit Outlook - It will ask you if you want to save the project, click Yes

  13. Start Outlook - It will give you a security notice. Select "Trust all documents from this publisher" (You can first confirm that you are the publisher by selecting "Show Signature Details")

    trust all documents

  14. That’s it! You’re all set. You never have to touch any of that code again or miss another meeting (unintentionally)


I've updated the code to use ActiveWindow instead of ActiveExplorer, which returns nothing "if no explorer is active." Thanks to CW for the impetus to update my code.