If you want an in Outlook answer then this post has most of the answer. However it didn't work for me as the reminder window is not visible until the Application_Reminder subroutine has finished, which means FindWindowA can't find the reminder window.
If you've got the same issue I hacked a solution by using SetTimer. I'll re-post the steps in full although the top and tail is just a repeat from the other post.
- Create a Digital certificate for later. Hit Start and type 'certificate', select 'Digital Certificate for VBA Projects'
- Enter a name for your certificate then press 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 the following code in:
Option Explicit
Private Sub Application_Quit()
' Turn off timer upon quitting VERY IMPORTANT
Call DeactivateTimer
End Sub
Private Sub Application_Reminder(ByVal Item As Object)
' Call helper function in 1 second as reminder window not yet visible
If TypeOf Item Is AppointmentItem Then ActivateTimer (1)
End Sub
- Add a new module by right clicking on 'ThisOutlookSession' and then selecting Insert > Module
- In the new module (which you should have switched to) paste the following code:
Option Explicit
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 SetTimer Lib "user32" ( _
ByVal hwnd As Long, _
ByVal nIDEvent As Long, _
ByVal uElapse As Long, _
ByVal lpTimerfunc As Long) As Long
Private Declare PtrSafe Function KillTimer Lib "user32" ( _
ByVal hwnd As Long, _
ByVal nIDEvent 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 TimerID As Long 'Need a timer ID to eventually turn off the timer. If the timer ID is not 0 then the timer is running
Public Sub ActivateTimer(ByVal nSeconds As Long)
'The SetTimer call accepts milliseconds, so convert to seconds
nSeconds = nSeconds * 1000
' Check to see if timer is running before call to SetTimer
If TimerID <> 0 Then Call DeactivateTimer
TimerID = SetTimer(0, 0, nSeconds, AddressOf Reminder_Helper)
If TimerID = 0 Then MsgBox "The timer failed to activate."
End Sub
Public Sub DeactivateTimer()
Dim lSuccess As Long
If TimerID <> 0 Then
lSuccess = KillTimer(0, TimerID)
If lSuccess = 0 Then
MsgBox "The timer failed to deactivate."
Else
TimerID = 0
End If
End If
End Sub
Private Sub Reminder_Helper(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idevent As Long, ByVal Systime As Long)
Dim ReminderWindowHWnd As Variant
If idevent = TimerID Then
On Error Resume Next
ReminderWindowHWnd = FindWindowA(vbNullString, "1 Reminder")
SetWindowPos ReminderWindowHWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS
DeactivateTimer
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
- Enable all macros in File > Options > Trust Center > Trust Center Settings > Macro Settings
- Close and re-open Outlook
I would have posted this on the bottom of the other post but it's locked to fresh users like me!