Outlook 日历通知不会显示在其他窗口之上

Outlook 日历通知不会显示在其他窗口之上

我在 64 位 Vista Business 上使用 Outlook 2007,一直遇到 Outlook 日历通知显示在其他窗口后面的问题。这让我唯一能想到我应该在开会的线索是任务栏上有一个蓝色条目。我还没有找到与此相关的设置。

有其他人遇到过这个问题吗?有人知道如何让通知窗口始终位于其他窗口之上吗?

答案1

这个免费的插件可能会帮助强制提醒窗口按照您希望的方式弹出: http://blogs.kraftkennedy.com/index.php/2010/06/07/getting-outlook-meeting-reminders-in-focus-over-other-applications/

答案2

如果您想要 Outlook 中的答案,那么这个帖子有大部分答案。但是它对我不起作用,因为提醒窗口在Application_Reminder子程序完成之前不可见,这意味着FindWindowA找不到提醒窗口。

如果你遇到了同样的问题,我使用 破解了一个解决方案SetTimer。我会重新发布完整的步骤,尽管顶部和尾部只是重复了另一篇文章

  • 创建数字证书以供日后使用。点击“开始”并输入“证书”,选择“VBA 项目的数字证书”
  • 输入证书名称,然后按完成
  • 打开 Outlook 并按ALT+F11启动 VBA 编辑器。
  • 在左侧的树中,展开“Microsoft Office Outlook 对象”并双击“ThisOutlookSession”
  • 粘贴以下代码:

选项明确

私有子应用程序_退出()

    ' 退出时关闭计时器 非常重要
    调用 DeactivateTimer

子目录结束

Private Sub Application_Reminder(ByVal 项目作为对象)

    ' 由于提醒窗口尚未可见,因此在 1 秒内调用辅助函数
    如果 TypeOf Item 为 AppointmentItem 则 ActivateTimer (1)

子目录结束

  • 右键单击“ThisOutlookSession”,然后选择“插入”>“模块”,添加新模块
  • 在新模块(您应该已经切换到该模块)中粘贴以下代码:

选项明确

私有声明 PtrSafe 函数 FindWindowA Lib“user32”(_
    ByVal lpClassName 作为字符串,_
    ByVal lpWindowName 作为字符串)作为 Long

私有声明 PtrSafe 函数 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

私有声明 PtrSafe 函数 SetTimer Lib“user32”(_
    ByVal hwnd As Long,_
    ByVal nIDEvent As Long,_
    ByVal uElapse As Long,_
    ByVal lpTimerfunc As Long)As Long

私有声明 PtrSafe 函数 KillTimer Lib“user32”(_
    ByVal hwnd As Long,_
    ByVal nIDEvent As Long)As Long

私有 Const SWP_NOSIZE = &H1
私有 Const SWP_NOMOVE = &H2
私有 Const FLAGS 只要 = SWP_NOMOVE 或 SWP_NOSIZE
私有 Const HWND_TOPMOST = -1

Private TimerID As Long '需要定时器 ID 才能最终关闭定时器。如果定时器 ID 不为 0,则定时器正在运行

公共子激活计时器(ByVal nSeconds As Long)

    'SetTimer 调用接受毫秒,因此转换为秒
    nSeconds = nSeconds * 1000

    ' 在调用 SetTimer 之前检查计时器是否正在运行
    如果 TimerID <> 0 则调用 DeactivateTimer

    TimerID = SetTimer(0, 0, nSeconds, Reminder_Helper 的地址)

    如果 TimerID = 0 则 MsgBox “计时器激活失败。”

子目录结束

Public Sub DeactivateTimer()

Dim lSuccess 为 Long

    如果 TimerID <> 0 则
        lSuccess = KillTimer(0, TimerID)
        如果 lSuccess = 0 则
            MsgBox "定时器停用失败。"
        否则
            TimerID = 0
        End If
    End If

子目录结束

Private Sub Reminder_Helper(ByVal hwnd 为长,ByVal uMsg 为长,ByVal idevent 为长,ByVal Systime 为长)

Dim ReminderWindowHWnd 作为变体

    如果 idevent = TimerID 则

        出错时继续下一个
        ReminderWindowHWnd = FindWindowA(vbNullString, "1 提醒")
        SetWindowPos ReminderWindowHWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS
        DeactivateTimer

    万一

子目录结束

  • 对宏进行签名,以便它能够运行,方法是转到“工具”>“数字签名...”,然后选择您之前创建的证书
  • 关闭 VBA 窗口
  • 在文件 > 选项 > 信任中心 > 信任中心设置 > 宏设置中启用所有宏
  • 关闭并重新打开 Outlook

我会把这个贴在另一篇文章但它对我这样的新用户来说是锁定的!

相关内容