Como manter os lembretes do Calendário do Outlook no topo do Windows 7

123

Estou começando a usar o Windows 7 e quero saber como fazer meus lembretes do Outlook aparecerem e aparecerem com destaque. Eles continuam abrindo discretamente, como apenas outra janela na pilha do Outlook na barra de tarefas. Como resultado, continuo ignorando-os porque eles aparecem atrás de todo o resto.

Como faço para torná-los menos fáceis de ignorar?

(Claramente, geralmente não se deseja aplicativos desagradáveis ​​que se destacam. Mas há alguns lugares onde esse comportamento é desejável, e os lembretes do calendário do Outlook são um deles.)

thursdaysgeek
fonte
16
Isto é tão necessário. Se alguém se concentra intensamente, é muito fácil perder um lembrete e notá-lo enterrado sob outras janelas somente depois que você se atrasa. É ridículo que não seja possível com uma configuração simples. Que bom é um lembrete se você não o receber imediatamente ?!
Mario Mario

Respostas:

61

Eu tive o mesmo problema com o Outlook 2010. Use as etapas mencionadas abaixo, funciona como um encanto. Não se esqueça de ativar todas as macros: Central de Confiabilidade> Configurações de Macro.

  • Crie um certificado digital para mais tarde: clique em Iniciar e digite 'certificate', selecione 'Digital Certificate for VBA Projects'
  • Digite um nome para o seu certificado. Clique OK. Abra o Outlook e pressione Alt+ F11para iniciar o editor VBA.
  • Na árvore à esquerda, expanda 'Objetos do Microsoft Office Outlook' e clique duas vezes em 'ThisOutlookSession'
  • Cole este código:

    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
    
  • Assine a macro para que ela seja executada: Ferramentas> Assinatura digital ... e escolha o certificado que você criou anteriormente

  • Feche a janela do VBA
  • Ative todas as macros em Arquivo> Opções> Central de Confiabilidade> Configurações da Central de Confiabilidade> Configurações de Macro
Gullu
fonte
3
notei que, às vezes (normalmente quando você inicia o Outlook), o primeiro lembrete não fica no topo. Depois de clicar em Ignorar e fechar o lembrete, todos os lembretes subsequentes ficam no topo. Não sei porque.
Gullu
3
O On Error Resume Nextúnico se aplica a esse Sub e apenas impede que toda a macro falhe. Esse é apenas o uso padrão do VBA.
Jeff Martin
3
Eu tive o mesmo problema que Gullu indicou em seu primeiro comentário. Para contornar isso, mostro uma caixa de mensagem para o primeiro lembrete após reiniciar o Outlook (ou o meu computador). Private messageAlreadyShown As Boolean Private Sub Application_Reminder (item ByVal como objeto) On Error Resume Next Se não for messageAlreadyShown e MsgBox "First Reminder", vbSystemModal, "" terminar se messageAlreadyShown = True ReminderWindow = FindWindowA (vbNullString, "1 Reminder") SetWindowPos ReminderWindow, HWND_TOPMOST, 0, 0, 0, 0, FLAGS End Sub
helios456
3
Ocorreu um problema ao encontrar a ferramenta para criar um certificado autoassinado para a macro. Encontrei-o em C: \ Arquivos de Programas \ Microsoft Office \ OfficeXX, a ferramenta SELFCERT.EXE.
SSZero
3
Eu mudei o meu para encontrar "1 lembrete (s)" e funcionou.
Robert Brooker 27/05
18

O AutoHotKey também pode ser usado para resolver isso. Esse script colocará a janela de lembrete no topo sem roubar o foco (testado com 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
}

Script AHK - EXE compilado

Eric L
fonte
+1 para usar o AHK. Acabei de testar isso no win 7 / outlook 2016. Ele traz a visão para a frente, mas na verdade não rouba o foco se você estiver digitando. Exatamente o que eu queria! (I apenas removido as pontas bandeja embora :))
Fawix
1
Observe que existe uma maneira muito fácil de iniciar o script com o Windows. Basta colocá-lo na pastaC:\Users\<username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
Fawix 15/09/16
Os links AHK Script e EXE compilado estão quebrados. Copiei e colei o script acima no meu script AutoHotKey.ahk e não funcionou.
Mike Cole
1
aqui está o EXE compilado drive.google.com/file/d/0B_pJVd8U0PfcWkZWNmhEYncwQjA/view
user664174 11/17/17
1
Obtendo para a pasta de inicialização pode ser feito facilmente entrar shell:startupem uma barra de endereços ou caixa de executar
Gert van den Berg
13

A melhor resposta que encontrei está aqui: Como fazer com que os lembretes de compromissos do Outlook apareçam na frente de outras janelas novamente usando um VBA simples.

Isso implica adicionar algumas linhas de código VBA simples ao "ThisOutlookSession". Agora, ele abre uma janela toda vez. Muito melhor.

  • Crie um certificado digital para mais tarde
  • Clique em Iniciar e digite 'certificado', selecione 'Certificado digital para projetos VBA'
  • Digite um nome para o seu certificado
  • Feito
  • Abra o Outlook e pressione Alt + F11 para iniciar o editor VBA.
  • Na árvore à esquerda, expanda 'Objetos do Microsoft Office Outlook' e clique duas vezes em 'ThisOutlookSession'
  • Cole este código, modificando o texto entre aspas para atender às suas preferências. Deixe as aspas em.

    Private Sub Application_Reminder(ByVal Item As Object)
    
    
        If TypeOf Item Is AppointmentItem Then
        MsgBox "Message text", vbSystemModal, "Message title"
        End If
    
    
    End Sub
    
  • Assine a Macro para que ela seja executada, vá em Ferramentas> Assinatura Digital ... e escolha o certificado que você criou anteriormente

  • Feche a janela do VBA
tommykey
fonte
Tentei isso no Outlook 2010, Windows 7, mas não funcionou :(
tekumara
Usou isso como parte da solução da Gullu. Muito obrigado.
Smandoli 28/09/12
Isso funcionou no Outlook 2007, enquanto o de Gullu não.
Will Sheppard
7

A partir da versão 1803 (fevereiro de 2018), a opção "Mostrar lembretes sobre outras janelas" já está disponível. Não parece estar ativado por padrão.

insira a descrição da imagem aqui

Advogado do diabo
fonte
3
Ainda não tenho a versão atualizada, mas isso é ótimo! E faz apenas 7 anos desde que eu perguntei também. (E isso é um dis pelo MS, bem como graças a você.)
thursdaysgeek
2
Esta é uma excelente atualização para uma pergunta antiga. Observe que isso não é exatamente o mesmo que "sempre no topo", mas garante que a janela apareça na parte superior da ordem z, para que os usuários tenham menos chances de perdê-la.
Marc LaFleur
6

Não tem jeito. Nossa empresa tentou encaminhar diretamente para a Microsoft. Uma coisa que as pessoas fazem aqui é atribuir um som mais desagradável, para ajudar a percebê-lo. Mas a Microsoft nos disse que é por design.

Brian
fonte
11
Eu trabalho em uma fazenda de cubos - tento manter meu computador silencioso para os outros. :(
thursdaysgeek
3
Se eles estivessem realmente projetando, fariam dessa maneira por padrão, mas permitiriam que ela fosse alterada. Eles "projetam", aprendemos a aturar isso?
thursdaysgeek
Veja minha resposta. Finalmente temos uma solução.
Gullu
Eu encontrei uma solução de terceiros. Ferramentas reais O Actual Window Guard $ 30 (que também está incluído em todos os produtos abrangentes, o Actual Windows Manager $ 50) permite que a atribuição de janelas esteja sempre no topo. Além disso, é fácil ativar e desativar o recurso. (observe que ele faz mais do que apenas isso para ajudar a tornar o preço mais fácil de aceitar.) Encontrei isso ao experimentar as ferramentas utilitárias de desktop virtual e vários monitores. Estou usando o último há alguns meses e estou muito feliz com isso.
precisa saber é o seguinte
Eu acho que a solução é usar uma ferramenta melhor! Para ruim que não é uma escolha para mim :(
Jonathan Benn
6

O mesmo que a resposta de Gullu acima, mas com alterações para acomodar diferentes títulos de janelas:

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
tbone
fonte
Melhor ainda seria algo como Dim olApp As Outlook.Application Set olApp = New Outlook.Application iReminderCount = olApp.Reminders.CountEntão você pode remover o loop.
Zusukar
@Zusukar Reminders.Countretorna o número total de lembretes definidos em compromissos, não na caixa de diálogo de lembrete ativo. No meu sistema, isso retorna 22, por exemplo.
Geoff
@Zusukar Idealmente, você poderia usar a propriedade Reminder.IsVisible para contar as visíveis, mas isso é sempre falso - presumivelmente o evento acontece antes que o lembrete seja marcado como visível.
Geoff
3

Isso também estava me incomodando. Após uma pesquisa intensa, encontrei uma resposta parcial: http://www.pcreview.co.uk/forums/hidden-outlook-reminders-t3972914.html

Se você alterar a configuração "Botões da barra de tarefas" em "Propriedades da barra de tarefas e do menu Iniciar" para "Nunca combinar", o agrupamento será separado e o lembrete será exibido na frente de qualquer outra coisa que você tenha aberto.

Tentei testá-lo e descobri que era inconsistente; uma vez, ficou escondido atrás do que eu estava trabalhando, e outra vez, apareceu na frente. Nos dois casos, havia um ícone na barra de tarefas que parecia diferente do próprio Outlook; portanto, havia pelo menos uma chance de eu perceber isso.

Mark Ransom
fonte
Não foi possível fazer com que o Outlook 2013 se comportasse corretamente, mesmo com o Never Combine. Outlook 2013, Windows 7 de 32 bits.
Sun
Esta não é uma boa solução para mim, como eu prefiro ter os aplicativos combinam na barra de tarefas
Jonathan Benn
3

Usei o Filebox eXtender e, quando o primeiro lembrete aparece, eu o abro e clico no novo ícone 'alfinete' no canto superior direito da barra de legenda. Então, quando o próximo lembrete chegar, ele aparecerá em primeiro plano ...

efeito jacorb
fonte
Me marque! fará o mesmo. É uma ferramenta portátil gratuita e executa essa tarefa extremamente bem. Eu testei o Outlook 2013 e funciona exatamente como eu quero. Primeiro plano do Outlook ou minimizado, o lembrete do calendário sempre aparece na frente.
Sun
@ Sun vai dar PinMe! um tiro
Chris Marisic 15/06
@ Sun i setup "super pin" na janela de notificação que deve garantir que ele esteja sempre perpetuamente visível, não importa o que aconteça, até que eu o descarte. Funciona como anunciado fora da caixa e fornece notificações sucessivas. impressionante.
Chris Marisic
Eu tentei o PinMe e não consigo fazer com que a janela fique no topo !! !! ??
tbone
1

Encontrei um complemento chamado ShowReminders ( http://www.sagelamp.com/pages/showreminders.aspx ), que traz a janela de lembretes para o topo. Até funciona quando você minimiza a janela de lembrete.

user245293
fonte
3
Diz que o produto custa US $ 20 a partir de out de 2014.
dom
O programa de instalação falha para mim no Windows 10:The following package files could not be found: C:\Users\ukeim\AppData\Local\Temp\IXP000.TMP\Office2007PIARedist\o2007pia.msi
Uwe Keim 10/11
0

Finalmente, encontro uma solução simples usando o Outlook VBA e um simples EXE.

Aqui está como nunca mais o Outlook perdeu o compromisso de reunião.

Por que um aplicativo exe autônomo apenas para esse fim? Bem, eu tinha a grande caixa vermelha incorporada no VBA, mas essa solução estava cheia de problemas (acredito que é porque tenho que usar hwnd e outras propriedades incomuns do sistema para manter a grande caixa vermelha no topo). Então, para simplificar, por que não um EXE básico que faz uma coisa? Você pode usar ferramentas gratuitas da microsoft (o Visual studio Community 2015 é gratuito).

Este é o código EXE. Windows simples formulário de aplicação com um formulário. Compile esse código.

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

E isso é tudo que eu preciso no VBA do Outlook. Coloque isso em 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
user2635566
fonte
0

Esta é uma versão aprimorada da resposta do tbone que funciona nas versões em alemão.

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

Eu adicionei títulos de janelas alemãs e também algumas novas funções ( BringWindowToTop, SetForegroundWindowe SetFocus).

Funciona no meu Windows 10 alemão em conjunto com o Outlook 2016.

Eu fiz não conseguem gerar um novo certificado (pressionando Iniciar e digitar "certificado" não revelou nada), mas simplesmente escolheu outro certificado na lista no momento da assinatura.

Uwe Keim
fonte
isso faz com que a aplicação apenas piscar, mas não traz a janela de notificação para a frente
KIC