如何在 Outlook 2021 中弹出 Outlook 提醒并保持领先地位

How to make an Outlook reminder popup and stay on top in Outlook 2021

提问人:X0-1 提问时间:11/1/2023 最后编辑:X0-1 更新时间:11/11/2023 访问量:54

问:

我正在尝试弹出 Outlook 提醒并在 Outlook 2021 中保持领先地位。

一个简单的宏对我有用,但由于如何弹出 Outlook 提醒并保持在其他窗口之上中描述的缺点,它不是很有帮助。

从上面帖子中接受的答案中,我将以下代码复制到“ThisOutlookSession”模块:

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

在“模块 1”中,复制了以下代码:

Option Explicit

Private Declare Function SetTimer Lib "User32" (ByVal hWnd As Long, ByVal nIDEvent As Long, _
  ByVal uElapse As Long, ByVal lpTimerfunc As Long) As Long
Private Declare Function KillTimer Lib "User32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long

Private Declare Function IsWindowVisible Lib "User32" (ByVal hWnd As Long) As Long

Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName _
  As String, ByVal lpWindowName As String) As Long
Private Declare Function ShowWindow Lib "User32" (ByVal hWnd As Long, ByVal nCmdSHow As Long) As Long
Private Declare 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

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 Long, ByVal uMsg As Long, ByVal idevent As Long, ByVal Systime As Long)
    Call EventFunction
End Sub

Public Function EventFunction()
    On Error Resume Next
    If TimerID <> 0 Then Call DeactivateTimer
    If hRemWnd = 0 Then hRemWnd = FindReminderWindow(100)
    If IsWindowVisible(hRemWnd) Then
        ShowWindow hRemWnd, 1                                   ' Activate Window
        SetWindowPos hRemWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS   ' Set Modal
    End If
End Function

Public Function FindReminderWindow(iUB As Integer) As Long
    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
    If FindReminderWindow <> 0 Then ShowWindow FindReminderWindow, 1
End Function

运行时错误消失了,上面的代码现在可以工作了。很可能是复制和粘贴错误。

VBA Outlook 焦点 提醒

评论

0赞 CHill60 11/1/2023
你能在这篇文章中更具体一点吗?共享代码或修复链接(最好两者兼而有之)。问题到底是什么?
0赞 Dmitry Streblechenko 11/1/2023
您的链接不指向帖子,而是链接到 stackoverflow.com 显示您正在使用的代码。
0赞 X0-1 11/1/2023
感谢您的快速回复 - 添加了第一次更新(请参阅我的编辑历史记录)
0赞 X0-1 11/11/2023
嗨,同时,上述脚本似乎在 MS Office 2021 桌面中运行良好。我不确定之前发生了什么。也许有人可以将消息传达到链接的来源,因为我无法在那里发表评论......

答: 暂无答案