Configure Outlook to always show meeting reminders on top but without stealing keyboard focus

  1. WIN+R, C:\Program Files (x86)\Microsoft Office\Office16\SELFCERT.exe
    1. Note: on some installations, it’s located instead at C:\Program Files (x86)\Microsoft Office\root\Office16\SELFCERT.exe
  2. Name=”Reminders Always On Top”, hit OK.
  3. Open Office 2016, hit ALT+F11 to open VBA window.
  4. In the tree on the left, expand ‘Microsoft Office Outlook Objects’ and double click on ‘ThisOutlookSession’
  5. Using Chrome (not Edge!) to view this page (because Edge somehow screws up the EOLs when you copy/paste *facepalm*), copy/paste the following code from here into the VBA editor:

    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
    Private Sub Application_Reminder(ByVal Item As Object)
        If TypeOf Item Is AppointmentItem Then
        Call ActivateTimer(1)
        End If
    End Sub
  6. In the tree on the left, right-click in empty space and choose Insert >> Module, then double-click on ‘Module1’.
  7. Again using Chrome (not Edge!) to view this page, copy/paste the following code from here into the VBA editor:

    Option Explicit
    Private Declare Function SetTimer Lib "user32" (ByVal hWnd As LongByVal nIDEvent As Long, _
        ByVal uElapse As LongByVal lpTimerfunc As LongAs Long
    Private Declare Function KillTimer Lib "user32" (ByVal hWnd As LongByVal nIDEvent As LongAs Long
    Private Declare Function IsWindowVisible Lib "user32" (ByVal hWnd As LongAs Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName _
        As StringByVal lpWindowName As StringAs Long
    Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As LongByVal nCmdSHow As LongAs Long
    Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As LongByVal hWndInsertAfter As Long, _
        ByVal As LongByVal As LongByVal cx As LongByVal cy As LongByVal wFlags As LongAs Long
    Public Declare Function GetTopWindow Lib "user32" (ByVal hWnd As LongAs Long
    Public Declare Function GetWindow Lib "user32" (ByVal hWnd As LongByVal uCmd As LongAs Long
    Private Const GW_HWNDFIRST = 0
    Private Const GW_HWNDNEXT = 2
    Private Const SWP_NOSIZE = &H1
    Private Const SWP_NOMOVE = &H2
    Private Const SWP_NOACTIVATE = &H10
    Private Const FLAGS As Long = SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE
    Private Const HWND_TOPMOST = -1
    Private Const HWND_TOP = 0
    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 LongByVal uMsg As LongByVal idevent As LongByVal Systime As Long)
        Call EventFunction
    End Sub
    Public Function EventFunction()
        On Error Resume Next
        If hRemWnd = 0 Then hRemWnd = FindReminderWindow(100)
        If hRemWnd = 0 Then
            If TimerID <> 0 Then Call DeactivateTimer
        Else
            If IsWindowVisible(hRemWnd) Then
                If SetWindowPos(hRemWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS) <> 0 Then ' Move it into the 'topmost' band
                    If SetWindowPos(hRemWnd, HWND_TOP, 0, 0, 0, 0, FLAGS) <> 0 Then ' Move it to the top of the Z-order
                        Dim hTopWnd As Long: hTopWnd = GetWindow(hRemWnd, GW_HWNDFIRST)
                        While hTopWnd <> 0 And 0 = IsWindowVisible(hTopWnd)
                            hTopWnd = GetWindow(hTopWnd, GW_HWNDNEXT)
                        Wend
                        ' SetWindowPos won't work while user session is locked, so we must double-check.
                        If hTopWnd = hRemWnd Then
                            If TimerID <> 0 Then Call DeactivateTimer
                        End If
                    End If
                End If
            End If
        End If
    End Function
    Public Function FindReminderWindow(iUB As IntegerAs Long
        On Error Resume Next
        Dim 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
    End Function
  8. Sign the Macro so it will run: Tools > Digital Signature… and choose the certificate you created earlier.
  9. Close the VBA window.
  10. Close all Outlook windows.  (If prompted to save the VBA project, choose to save it.)
  11. Relaunch Outlook.
  12. You should get a modal security dialog for the new VBA script you wrote.  Click “Trust all documents from this publisher”.  This is a one-time process (you should never need to do this step again).
Advertisements
This entry was posted in Uncategorized. Bookmark the permalink.

29 Responses to Configure Outlook to always show meeting reminders on top but without stealing keyboard focus

  1. Mike Hislop says:

    I got into trouble with certificates. I did what you say, but there then followed a set of errors pertaining to the self-signed certificate not being in the root CA store. I moved it, at which point I could no longer use it to sign the macro. So still not working. It remains to me a royal PITA that Outlook doesn’t pop an alert to the top of the stack – why don’t they think I want to be alerted, when I asked to be alerted?

    • c0d3h4x0r says:

      Sorry, don’t know what to tell you. I’m not an expert on certs, I just cobbled this together from a few other sources of instructions until I got something that worked. If you ever figure it out, please post again here to let folks know what worked.

  2. Nils says:

    For 64bit versions folder structures are without ‘ (x86)’.

  3. Nils says:

    hm. Scripts not working in 64bit version. :-/

    • Nils says:

      Could solveit. PtrSafe has to be added between Declare and Function in the first part of the script. Additionally I exchanged every Long with LongPtr.

      • c0d3h4x0r says:

        Thanks for the insights. We only use 32-bit Outlook here at my workplace. I’ll see if I can incorporate your feedback w/o busting it for 32-bit Outlook.

      • Ksd8y says:

        Thanks for this. I have the 64 bit version as well, but incorporated your edits and it worked!

      • rup says:

        So your updates allowed me to save the the vba file/launch Outlook, but it still doesn’t change the behavior. Is it possible I’m missing something, as Ksd8y says it’s working on their 64 bit version. I had such hopes……

  4. LJ says:

    This worked great for me.
    Thank you!

  5. Chris W. says:

    Awesome thanks guys, works great!

  6. Slava says:

    This looks promising and mostly works but when the “Reminders” window is minimized it still does not work. Say the “Reminders” window is closed and the initial notification shows up as it should, on top of all open windoes. Great. I “Snooze” it for 5 minutes and _minimize_ (not close) the window so it goes down to the taskbar. When the time comes, the window “blinks” yellow in the task bar but does not show up at all.

    I have Office 2010 32 bit and Windows 7 64 bit.

    • c0d3h4x0r says:

      Interesting usage case. My reminders window always automatically closes because I always deal with all meeting notifications to clear out the list… but it sounds like you don’t use it that way.

    • Slava says:

      It looks like I was able to resolve it with a “Restore” ShowWindow function:
      If hTopWnd = hRemWnd Then
      Call ShowWindow(hRemWnd, 9) ‘ 9 stands for SW_RESTORE
      If TimerID 0 Then Call DeactivateTimer
      End If

      It works fine and apparently does not affect other scenarios when the window is not minimized. Thank you c0d3h4x0r – no more missed meetings!

      • rup says:

        So I have the same issue. I don’t always resolve what’s in my Reminders – in fact I often don’t but refer to it from time to time to see what needs to be addressed. But if a meeting comes up, I need that reminder to trigger on top of what I’m working on else I’ll miss the meeting.

        I was confused at first, thought you meant to create a function instead of calling the ShowWindow fn…so added that in and seems to be working in my 64 bit 2016 version. I did have a couple of times when it seems like the reminder didn’t even trigger (let alone post on top) when I snoozed a reminder, but I can’t reproduce that systematically.

        Thanks!

  7. Peter says:

    Didn’t work for me on 64bit Outlook sadly

    • Brett says:

      Changing “Declare” to “Declare PtrSafe” and “Long” to “LongLong” everywhere in the second cut and past section allows it to work on Outlook 64bit:

      Option Explicit
      Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hWnd As LongLong, ByVal nIDEvent As LongLong, _
          ByVal uElapse As LongLong, ByVal lpTimerfunc As LongLong) As LongLong
      Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hWnd As LongLong, ByVal nIDEvent As LongLong) As LongLong
      Private Declare PtrSafe Function IsWindowVisible Lib "user32" (ByVal hWnd As LongLong) As LongLong
      Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName _
          As String, ByVal lpWindowName As String) As LongLong
      Private Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hWnd As LongLong, ByVal nCmdSHow As LongLong) As LongLong
      Private Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hWnd As LongLong, ByVal hWndInsertAfter As LongLong, _
          ByVal X As LongLong, ByVal Y As LongLong, ByVal cx As LongLong, ByVal cy As LongLong, ByVal wFlags As LongLong) As LongLong
      Public Declare PtrSafe Function GetTopWindow Lib "user32" (ByVal hWnd As LongLong) As LongLong
      Public Declare PtrSafe Function GetWindow Lib "user32" (ByVal hWnd As LongLong, ByVal uCmd As LongLong) As LongLong
      Private Const GW_HWNDFIRST = 0
      Private Const GW_HWNDNEXT = 2
      Private Const SWP_NOSIZE = &H1
      Private Const SWP_NOMOVE = &H2
      Private Const SWP_NOACTIVATE = &H10
      Private Const FLAGS As LongLong = SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE
      Private Const HWND_TOPMOST = -1
      Private Const HWND_TOP = 0
      Public TimerID As LongLong 'Need a timer ID to turn off the timer. If the timer ID  0 then the timer is running
      Public hRemWnd As LongLong 'Store the handle of the reminder window
      Public Sub ActivateTimer(ByVal Seconds As LongLong) '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 LongLong: Success = KillTimer(0, TimerID)
          If Success  0 Then TimerID = 0
      End Sub
      Public Sub TriggerEvent(ByVal hWnd As LongLong, ByVal uMsg As LongLong, ByVal idevent As LongLong, ByVal Systime As LongLong)
          Call EventFunction
      End Sub
      Public Function EventFunction()
          On Error Resume Next
          If hRemWnd = 0 Then hRemWnd = FindReminderWindow(100)
          If hRemWnd = 0 Then
              If TimerID  0 Then Call DeactivateTimer
          Else
              If IsWindowVisible(hRemWnd) Then
                  If SetWindowPos(hRemWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)  0 Then ' Move it into the 'topmost' band
                      If SetWindowPos(hRemWnd, HWND_TOP, 0, 0, 0, 0, FLAGS)  0 Then ' Move it to the top of the Z-order
                          Dim hTopWnd As LongLong: hTopWnd = GetWindow(hRemWnd, GW_HWNDFIRST)
                          While hTopWnd  0 And 0 = IsWindowVisible(hTopWnd)
                              hTopWnd = GetWindow(hTopWnd, GW_HWNDNEXT)
                          Wend
                          ' SetWindowPos won't work while user session is locked, so we must double-check.
                          If hTopWnd = hRemWnd Then
                              If TimerID  0 Then Call DeactivateTimer
                          End If
                      End If
                  End If
              End If
          End If
      End Function
      Public Function FindReminderWindow(iUB As Integer) As LongLong
          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
      End Function
      
  8. Brett says:

    Here are the changing “Declare” to “Declare PtrSafe” and “Long” to “LongLong” everywhere in the second cut and past section allows it to work on Outlook 64bit:


    Option Explicit
    Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hWnd As LongLong, ByVal nIDEvent As LongLong, _
    ByVal uElapse As LongLong, ByVal lpTimerfunc As LongLong) As LongLong
    Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hWnd As LongLong, ByVal nIDEvent As LongLong) As LongLong
    Private Declare PtrSafe Function IsWindowVisible Lib "user32" (ByVal hWnd As LongLong) As LongLong
    Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName _
    As String, ByVal lpWindowName As String) As LongLong
    Private Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hWnd As LongLong, ByVal nCmdSHow As LongLong) As LongLong
    Private Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hWnd As LongLong, ByVal hWndInsertAfter As LongLong, _
    ByVal X As LongLong, ByVal Y As LongLong, ByVal cx As LongLong, ByVal cy As LongLong, ByVal wFlags As LongLong) As LongLong
    Public Declare PtrSafe Function GetTopWindow Lib "user32" (ByVal hWnd As LongLong) As LongLong
    Public Declare PtrSafe Function GetWindow Lib "user32" (ByVal hWnd As LongLong, ByVal uCmd As LongLong) As LongLong
    Private Const GW_HWNDFIRST = 0
    Private Const GW_HWNDNEXT = 2
    Private Const SWP_NOSIZE = &H1
    Private Const SWP_NOMOVE = &H2
    Private Const SWP_NOACTIVATE = &H10
    Private Const FLAGS As LongLong = SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE
    Private Const HWND_TOPMOST = -1
    Private Const HWND_TOP = 0
    Public TimerID As LongLong 'Need a timer ID to turn off the timer. If the timer ID 0 then the timer is running
    Public hRemWnd As LongLong 'Store the handle of the reminder window
    Public Sub ActivateTimer(ByVal Seconds As LongLong) '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 LongLong: Success = KillTimer(0, TimerID)
    If Success 0 Then TimerID = 0
    End Sub
    Public Sub TriggerEvent(ByVal hWnd As LongLong, ByVal uMsg As LongLong, ByVal idevent As LongLong, ByVal Systime As LongLong)
    Call EventFunction
    End Sub
    Public Function EventFunction()
    On Error Resume Next
    If hRemWnd = 0 Then hRemWnd = FindReminderWindow(100)
    If hRemWnd = 0 Then
    If TimerID 0 Then Call DeactivateTimer
    Else
    If IsWindowVisible(hRemWnd) Then
    If SetWindowPos(hRemWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS) 0 Then ' Move it into the 'topmost' band
    If SetWindowPos(hRemWnd, HWND_TOP, 0, 0, 0, 0, FLAGS) 0 Then ' Move it to the top of the Z-order
    Dim hTopWnd As LongLong: hTopWnd = GetWindow(hRemWnd, GW_HWNDFIRST)
    While hTopWnd 0 And 0 = IsWindowVisible(hTopWnd)
    hTopWnd = GetWindow(hTopWnd, GW_HWNDNEXT)
    Wend
    ' SetWindowPos won't work while user session is locked, so we must double-check.
    If hTopWnd = hRemWnd Then
    If TimerID 0 Then Call DeactivateTimer
    End If
    End If
    End If
    End If
    End If
    End Function
    Public Function FindReminderWindow(iUB As Integer) As LongLong
    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
    End Function

  9. Dave says:

    I have Windows 10 64 bit and Office 16. I tried all of the above and it does not work.
    Step 12 never happens (the security thing).
    I also did use the code for the 64 bit.
    The pest notification window still pops up behind the scenes.

    Now I get a digital certificate error every time I log into Outlook. Looks like I’ll just remove everything I did here and go back to missing meetings.

  10. Matthew Prentice says:

    Fantastic! Thank you for this. One note: Be sure to completely close Skype for Business also as it is tied with Outlook and prevents the complete restart needed to activated the macro.

  11. Mike Z says:

    Still not working in Outlook 2016 in Windows 10. Made all the changes step by step, including trying the changes for the 64-bit version. After reopening Outlook, I never saw the “Trust all documents from this publisher” prompt. The alert window is still popping up behind other windows. Microshaft is a FAIL.

  12. dfyler says:

    For some reason all the occurrences of “” in the above 64bit corrected versions have disappeared and need to be replaced. There is about 6 of them. Refer to the top 32bit version which still has them. Once this was fixed it worked great.

  13. dfyler says:

    I just checked my previous comment and noticed the symbols I said were missing are also missing from my comment! The missing characters are the Less-Than and Greater-Than symbols. Together they are the Basic notation for “not equal to”.

  14. Cecil says:

    I made a few changes like other commenters suggested for the 64 bit version of windows and it works like a charm! Thanks man!

  15. DT says:

    Worked great (Outlook 2016 MSO (16..0.9126.2259) . Thanks! I don’t know how this stuff works but now I just hope the company restrictions don’t clear this out on me somehow.

  16. dot19408 says:

    Thank You!
    I’ve missed 2 important meetings because the blasted reminder window pops up BEHIND other windows… My boss was NOT amused.

    Outlook on the Mac has the option to flash inverted screen colors, so even if the reminder window opens on another screen I would know something is up. Why can’t Microsoft make that an option in Windows?

  17. BGCustoms says:

    I could not get this to work on 64-bit Outlook 2016 on Win10. I followed the 32-bit directions and made the necessary 64-bit changes as mentioned above (including the missing greater/lesser than symbols) but Step 12 never happens. My environment may disable macros or user-made security certs, I don’t know.

    • rup says:

      So, this code worked for me in my 64-bit Outlook on Win10. Copy/paste as is, no changes to the code are necessary. The other steps about signing it and such are though…

      Option Explicit
      Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr, _
          ByVal uElapse As LongPtr, ByVal lpTimerfunc As LongPtr) As LongPtr
      Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr) As LongPtr
      Private Declare PtrSafe Function IsWindowVisible Lib "user32" (ByVal hWnd As LongPtr) As LongPtr
      Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName _
          As String, ByVal lpWindowName As String) As LongPtr
      Private Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hWnd As LongPtr, ByVal nCmdSHow As LongPtr) As LongPtr
      Private Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hWnd As LongPtr, ByVal hWndInsertAfter As LongPtr, _
          ByVal X As LongPtr, ByVal Y As LongPtr, ByVal cx As LongPtr, ByVal cy As LongPtr, ByVal wFlags As LongPtr) As LongPtr
      Public Declare PtrSafe Function GetTopWindow Lib "user32" (ByVal hWnd As LongPtr) As LongPtr
      Public Declare PtrSafe Function GetWindow Lib "user32" (ByVal hWnd As LongPtr, ByVal uCmd As LongPtr) As LongPtr
      Private Const GW_HWNDFIRST = 0
      Private Const GW_HWNDNEXT = 2
      Private Const SWP_NOSIZE = &H1
      Private Const SWP_NOMOVE = &H2
      Private Const SWP_NOACTIVATE = &H10
      Private Const FLAGS As LongPtr = SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE
      Private Const HWND_TOPMOST = -1
      Private Const HWND_TOP = 0
      Public TimerID As LongPtr 'Need a timer ID to turn off the timer. If the timer ID  0 then the timer is running
      Public hRemWnd As LongPtr 'Store the handle of the reminder window
      Public Sub ActivateTimer(ByVal Seconds As LongPtr) '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 LongPtr: Success = KillTimer(0, TimerID)
          If Success  0 Then TimerID = 0
      End Sub
      Public Sub TriggerEvent(ByVal hWnd As LongPtr, ByVal uMsg As LongPtr, ByVal idevent As LongPtr, ByVal Systime As LongPtr)
          Call EventFunction
      End Sub
      Public Function EventFunction()
          On Error Resume Next
          If hRemWnd = 0 Then hRemWnd = FindReminderWindow(100)
          If hRemWnd = 0 Then
              If TimerID  0 Then Call DeactivateTimer
          Else
              If IsWindowVisible(hRemWnd) Then
                  If SetWindowPos(hRemWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)  0 Then ' Move it into the 'topmost' band
                      If SetWindowPos(hRemWnd, HWND_TOP, 0, 0, 0, 0, FLAGS)  0 Then ' Move it to the top of the Z-order
                          Dim hTopWnd As LongPtr: hTopWnd = GetWindow(hRemWnd, GW_HWNDFIRST)
                          While hTopWnd  0 And 0 = IsWindowVisible(hTopWnd)
                              hTopWnd = GetWindow(hTopWnd, GW_HWNDNEXT)
                          Wend
                          ' SetWindowPos won't work while user session is locked, so we must double-check.
                          If hTopWnd = hRemWnd Then
                              Call ShowWindow(hRemWnd, 9)
                              If TimerID  0 Then Call DeactivateTimer
                          End If
                      End If
                  End If
              End If
          End If
      End Function
      Public Function FindReminderWindow(iUB As Integer) As LongPtr
          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
      End Function

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s