如何使它们不那么容易被忽略?
(很明显,通常它们不会想要将自己的应用程序推到最前沿的讨厌的应用程序。但是在某些地方,这种行为是可取的,而Outlook日历提醒就是其中之一。)
#1 楼
我在使用Outlook 2010时遇到了同样的问题。使用下面提到的步骤,它的工作原理很吸引人。不要忘记启用所有宏:“信任中心”>“宏设置”。创建数字证书供以后使用:单击“开始”并键入
“证书”,选择“数字证书”。 for VBA Projects
输入证书名称。单击确定。打开Outlook,然后按Alt + F11来启动VBA编辑器。
在左侧的树中,展开“ Microsoft Office Outlook对象”,然后双击“ ThisOutlookSession”。
粘贴以下代码:
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 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 Sub Application_Reminder(ByVal Item As Object)
Dim ReminderWindowHWnd As Variant
On Error Resume Next
ReminderWindowHWnd = FindWindowA(vbNullString, "1 Reminder")
SetWindowPos ReminderWindowHWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS
End Sub
对宏进行签名,使其可以运行:工具>数字签名...,然后选择您之前创建的证书
关闭VBA窗口
在文件>选项>信任中心中启用所有宏>信任中心设置>宏设置
评论
我注意到,有时(通常在启动Outlook时)第一个提醒不会停留在最前面。单击“关闭”并关闭提醒后,所有后续提醒都将停留在顶部。不知道为什么。
–古鲁
2012年8月16日19:58
On Error Resume Next仅适用于该Sub,并且只能防止整个宏崩溃。。这只是标准VBA用法。
–杰夫·马丁(Jeff Martin)
2012-12-11 15:52
我和古鲁在第一句话中指出的一样。为了解决此问题,我在重新启动Outlook(或我的计算机)后显示了一个用于第一个提醒的消息框。私有messageAlreadyShown作为布尔值私有子Application_Reminder(作为对象的ByVal项)错误恢复时的下一个消息,如果不是messageAlreadyShown,则MsgBox“ First Reminder”,vbSystemModal,“” End如果messageAlreadyShown = True ReminderWindow = FindWindowA(vbNullString,“ 1 Reminder”)SetWindowPosminder HWND_TOPMOST,0、0、0、0,标志结尾子
–helios456
2014-02-18 12:55
我很难找到为宏创建自签名证书的工具。我在工具SELFCERT.EXE的C:\ Program Files \ Microsoft Office \ OfficeXX中找到它。
– SSZero
2014年7月3日在16:00
我更改了我的代码,找到了“ 1个提醒”,然后它起作用了。
–罗伯特·布鲁克(Robert Brooker)
15年5月27日在1:29
#2 楼
AutoHotKey也可以用来解决此问题。该脚本将提醒窗口置于顶部而不会失去焦点(已在Win10 / Outlook 2013中进行了测试)TrayTip Script, Looking for Reminder window to put on top, , 16
SetTitleMatchMode 2 ; windows contains
loop {
WinWait, Reminder(s),
WinSet, AlwaysOnTop, on, Reminder(s)
WinRestore, Reminder(s)
TrayTip Outlook Reminder, You have an outlook reminder open, , 16
WinWaitClose, Reminder(s), ,30
}
AHK脚本-编译的EXE
评论
+1使用AHK。我刚刚在win 7 / Outlook 2016中对此进行了测试。它可以将视图显示在最前面,但是如果您打字,它实际上并不会占据焦点。正是我想要的! (尽管我只是删除了纸盘提示:))
– Faix
16 Sep 14 '21:47
请注意,有一种非常简单的方法可以使脚本以Windows开头。只需将其放在文件夹C:\ Users \ <用户名> \ AppData \ Roaming \ Microsoft \ Windows \ Start Menu \ Programs \ Startup
– Faix
16-09-15在14:15
AHK脚本和已编译EXE链接已损坏。我将上面的脚本复制并粘贴到了AutoHotKey.ahk脚本中,但该脚本无法正常工作。
–迈克·科尔(Mike Cole)
17 Mar 30 '17在15:30
这是已编译的EXE drive.google.com/file/d/0B_pJVd8U0PfcWkZWNmhEYncwQjA/view
–user664174
17年7月11日在8:22
通过在地址栏或运行框中输入shell:startup,可以轻松地到达启动文件夹。
– Gert van den Berg
18年8月17日在7:48
#3 楼
我找到的最佳答案是:如何使用一些简单的VBA使Outlook约会提醒再次在其他窗口前弹出。它需要在“ ThisOutlookSession”。现在,它每次都会弹出一个窗口。更好。
创建数字证书以供以后使用
单击“开始”并键入“ certificate”,选择“ VBA项目的数字证书”
输入证书的名称
完成
打开Outlook并按Alt + F11启动VBA编辑器。
在左侧的树中,展开“ Microsoft Office Outlook对象”,然后双击“ ThisOutlookSession'
粘贴此代码,修改引号中的文本以适合您的偏好。保留引号。
Private Sub Application_Reminder(ByVal Item As Object)
If TypeOf Item Is AppointmentItem Then
MsgBox "Message text", vbSystemModal, "Message title"
End If
End Sub
对宏进行签名,以使其运行,方法是转到“工具”>“数字签名...”,然后选择您之前创建的证书
,关闭该宏。 VBA窗口
评论
在Windows 2010的Outlook 2010中对此进行了尝试,但是它不起作用:(
– tekumara
2012年5月15日下午4:49
将此用作Gullu解决方案的一部分。非常感谢。
– Smandoli
2012-09-28 14:16
这适用于Outlook 2007,而Gullu则不行。
–威尔·谢泼德(Will Sheppard)
2014-09-24 9:50
#4 楼
从版本1803(2018年2月)开始,“显示其他窗口上方的提醒”选项现在可用。默认情况下似乎未启用它。评论
我还没有更新的版本,但这太好了!我问了也只有七年了。 (那是MS的麻烦,也是对您的感谢。)
–thursdaysgeek
18年6月1日在18:27
这是对旧问题的绝妙更新。请注意,这与“总是在顶部”并不完全相同,但是它确实确保了窗口确实在z顺序的顶部弹出,因此用户不太可能错过它。
– Marc LaFleur
18年6月5日在16:07
我从Office Professional 2019的版本1808(内部版本10361.20002 Office``一键启动'')中没有此选项:-(
–加百利·戴维勒(Gabriel Devillers)
20年6月25日在15:29
我正在运行Outlook for Microsoft 365(16.0.12827.20328),但仍然可以选择。奇怪的。
–恶魔的拥护者
20年6月25日在21:53
#5 楼
不可能。我们公司尝试将其直接升级到Microsoft。人们在这里要做的一件事就是给它分配一个更令人讨厌的声音,以帮助注意它。但是微软已经告诉我们这是设计使然。评论
我在一个多维数据集场中工作-我试图使计算机对他人保持安静。 :(
–thursdaysgeek
2011年3月1日21:42
如果他们是真正的设计者,则默认情况下会采用这种方式,但可以对其进行更改。他们的“设计”,我们学会忍受了吗?
–thursdaysgeek
2011年3月1日在21:44
看我的答案。我们终于有了解决方案。
–古鲁
2012年8月16日15:20
我确实找到了第三方解决方案。实际工具实际Windows Guard $ 30(也包含在其所有产品中,实际Windows Manager $ 50)允许分配窗口始终位于最前面。加上易于打开和关闭功能。 (请注意,它所做的不仅仅是使价格标签更容易接受。)我在尝试虚拟桌面和多显示器实用工具时发现了这些。我已经使用后者几个月了,对此我感到非常满意。
– Javaru
13年8月23日在12:51
我猜解决方案是使用更好的工具!糟糕的是,这不是我的选择:(
–乔纳森·本恩
17年5月3日,17:26
#6 楼
与上面的Gullu回答相同,但进行了更改以适应不同的窗口标题: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 Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const FLAGS As Long = SWP_NOMOVE Or SWP_NOSIZE
Private Const HWND_TOPMOST = -1
'// TO ACCOUNT FOR WINDOW TITLE CHANGING WITH NOTIFICATION COUNT:
Private Sub Application_Reminder(ByVal Item As Object)
Dim ReminderWindowHWnd As Variant
'On Error Resume Next
On Error GoTo err
'Loop 25 times as FindWindowA needs exact title which varies according to number of reminder items...
Dim iReminderCount As Integer
For iReminderCount = 1 To 25
'Try two syntaxes...
ReminderWindowHWnd = FindWindowA(vbNullString, iReminderCount & " Reminder"): SetWindowPos ReminderWindowHWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS
ReminderWindowHWnd = FindWindowA(vbNullString, iReminderCount & " Reminder(s)"): SetWindowPos ReminderWindowHWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS
Next
Exit Sub
err:
Debug.Print err.Number & " - " & err.Description & " (iReminderCount = " & iReminderCount & ")"
Resume Next
End Sub
评论
更好的是将Dim olApp As Outlook.Application设置为olApp = New Outlook.Application iReminderCount = olApp.Reminders.Count然后可以删除循环。
– Zusukar
2015年3月20日在13:59
@Zusukar Reminders.Count返回约会中设置的提醒总数,而不是活动提醒对话框中设置的提醒总数。例如,在我的系统中,此返回22。
– Geoff
16年4月15日在19:29
@Zusukar理想情况下,您可以使用Reminder.IsVisible属性来计算可见的内容,但这始终是错误的-假定事件发生在提醒被标记为可见之前。
– Geoff
16年4月15日在19:36
#7 楼
这也困扰着我。经过一番激烈的搜索,我找到了部分答案:http://www.pcreview.co.uk/forums/hidden-outlook-reminders-t3972914.html如果您更改“将“任务栏和开始
菜单属性”下的“任务栏按钮”
设置为“永不合并”,
然后分组分离,
提醒弹出在任何地方
否则您打开了。
我尝试对其进行测试,发现它不一致;一次它隐藏在我正在处理的内容后面,另一次突然出现在我前面。在这两种情况下,任务栏上的图标看上去都与Outlook本身不同,因此至少有机会我会注意到它。
评论
即使使用“从不合并”,也无法使Outlook 2013正常运行。 Outlook 2013,Windows 7 32位。
–太阳
15年4月21日在23:50
这对我来说不是一个好的解决方案,因为我更喜欢将应用程序合并到任务栏中
–乔纳森·本恩
17年5月3日,17:27
#8 楼
我使用了Filebox eXtender,当第一个提醒出现时,我将其打开并单击标题栏右上角的新“图钉”图标。然后,当下一个提醒进入时,它就在前台...评论
PinMe!将做同样的事情。它是一种免费的便携式工具,可以很好地完成这一任务。我已经测试过Outlook 2013,它完全可以按照我的要求工作。 Outlook前景最小化或最小化,日历提醒始终弹出到最前面。
–太阳
2015年4月21日在23:49
@Sun将给PinMe!一枪
–克里斯·马里西奇(Chris Marisic)
16年6月15日在18:07
@Sun我在通知窗口上设置了“超级大头针”,无论它如何运行,都应确保它始终永久可见,直到我将其关闭为止。开箱即用地进行广告宣传,并连续发送通知。太棒了
–克里斯·马里西奇(Chris Marisic)
16年6月15日在18:26
我尝试了PinMe,却根本无法将窗口停留在顶部!
–tbone
18年4月18日在22:51
#9 楼
我找到了一个名为ShowReminders(http://www.sagelamp.com/pages/showreminders.aspx)的插件,它将提醒窗口带到顶部。当您最小化提醒窗口时,它甚至可以工作。评论
截至2014年10月,产品价格为$ 20。
–太阳
14-10-29在21:14
Windows 10上的安装程序对我而言失败:找不到以下程序包文件:C:\ Users \ ukeim \ AppData \ Local \ Temp \ IXP000.TMP \ Office2007PIARedist \ o2007pia.msi
– Uwe Keim
15年11月10日在10:48
#10 楼
我终于找到了使用Outlook VBA和简单EXE的简单解决方案。这是永远不会再错过Outlook会议约会的方法。
为什么要为此使用独立的exe应用程序目的?好吧,我在VBA中嵌入了大红色框,但是该解决方案充满了问题(我相信是因为我必须使用hwnd和其他异常系统属性才能将大红色框置于顶部)。因此,为了使事情变得简单,为什么不做一件事情的基本EXE。您可以使用Microsoft的免费工具(Visual Studio Community 2015是免费的)。
这是EXE代码。一个窗体的简单Windows窗体应用程序。编译此代码。
Imports System.Timers
Public Class Form1
Dim tTimer As New Timer
Public Sub New()
InitializeComponent()
Me.StartPosition = Windows.Forms.FormStartPosition.CenterScreen
Me.TopMost = True
Me.TopLevel = True
End Sub
Private Sub Form1_DoubleClick(sender As Object, e As EventArgs) Handles Me.DoubleClick
Application.Exit()
End Sub
Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
flashingQuick()
End Sub
Sub flashingQuick()
tTimer.Start()
AddHandler tTimer.Elapsed, New ElapsedEventHandler(AddressOf TimerTick)
End Sub
Sub TimerTick(ByVal source As [Object], ByVal e As ElapsedEventArgs)
Dim theTimer As System.Timers.Timer = DirectCast(source, System.Timers.Timer)
theTimer.Interval = 500
theTimer.Enabled = True
If Me.BackColor = System.Drawing.SystemColors.Control Then
Me.BackColor = Color.Red
Else
Me.BackColor = System.Drawing.SystemColors.Control
End If
End Sub
End Class
这就是我在Outlook VBA中所需要的。将此放入ThisOutlookSession
Private Sub Application_Reminder(ByVal Item As Object)
On Error Resume Next
If Item.MessageClass <> "IPM.Appointment" Then
Exit Sub
End If
Dim sAPPData As String
Dim sFileName As String
sAPPData = Environ("AppData")
sFileName = "\Microsoft\Windows\Start Menu\Programs\BigRedBox\BigRedBox.exe"
If Dir(sAPPData & sFileName) <> "" Then
Call Shell(sAPPData & sFileName)
End If
End Sub
#11 楼
这是tbone答案的增强版本,适用于德语版本。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 BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Boolean
Private Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Boolean
Private Declare PtrSafe Function SetFocus Lib "user32" (ByVal hwnd 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 Sub Application_Reminder(ByVal Item As Object)
Dim ReminderWindowHWnd As Variant
On Error GoTo err
'Loop 25 times as FindWindowA needs exact title which varies according to number of reminder items...
Dim iReminderCount As Integer
For iReminderCount = 1 To 25
'Try two syntaxes...
ReminderWindowHWnd = FindWindowA(vbNullString, iReminderCount & " Erinnerung")
SetWindowPos ReminderWindowHWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS
BringWindowToTop (ReminderWindowHWnd)
SetForegroundWindow ReminderWindowHWnd
SetFocus ReminderWindowHWnd
ReminderWindowHWnd = FindWindowA(vbNullString, iReminderCount & " Erinnerung(en)")
SetWindowPos ReminderWindowHWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS
BringWindowToTop ReminderWindowHWnd
SetForegroundWindow ReminderWindowHWnd
SetFocus ReminderWindowHWnd
Next
Exit Sub
err:
Debug.Print err.Number & " - " & err.Description & " (iReminderCount = " & iReminderCount & ")"
Resume Next
End Sub
我添加了德语窗口标题以及一些新功能(
BringWindowToTop
,SetForegroundWindow
和SetFocus
) 。可在我的德语Windows 10上与Outlook 2016一起使用。
我没有设法生成新证书(按“开始”并输入“ certificate”没有显示任何内容),但是签名时只需在列表中选择另一个证书即可。
评论
这会使应用程序只是闪烁而不会将通知窗口置于最前面
– KIC
16年4月13日在9:31
评论
这是非常必要的。如果人们集中注意力,很容易错过提醒,并注意到只有在您迟到之后,它才会埋在其他窗户下。荒谬的是,使用一些简单的设置是不可能的。如果您不及时得到提醒,有什么好处呢?!