次の方法で共有


Acessando horário selecionado no calendário do Outlook

Olá pessoal, estive conversando com um parceiro Microsoft que eu atendo e eles estavam tendo problemas para acessar as informações de data e hora marcadas no calendário do Outlook, fiz alguns testes para ajudá-los e abaixo mostro as minhas conclusões.

Infelizmente o Outlook não possui uma API para este tipo de consulta. Se você tentar buscar os itens selecionados no calendário recebe como retorno uma coleção vazia, o que tem sentido, de fato não existe mesmo nenhum compromisso selecionado, apenas horários vagos na agenda, concordam? ;)

Se você tentar criar um compromisso via API, ele também não será criado na data selecionada no calendário. A saída neste caso é enganar o Outlook criando um novo compromisso através do botão correspondente na toolbar. O código para isto está abaixo:

 private object myMissing = System.Reflection.Missing.Value;

        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            AddCommandBar();
        }

        private void AddCommandBar()
        {
            var myExplorer = this.Application.ActiveExplorer();

            var myCommandBar = myExplorer.CommandBars["Standard"];
            var myButton = (Office.CommandBarButton)myCommandBar.Controls.Add(Office.MsoControlType.msoControlButton, myMissing, myMissing, 2, 1);

            myButton.Caption = "Buscar Data Selecionada";
            myButton.Style = Office.MsoButtonStyle.msoButtonCaption;

            myButton.Click += new Office._CommandBarButtonEvents_ClickEventHandler(myButton_Click);

            myCommandBar.Visible = true;
            myCommandBar.Enabled = true;
            myCommandBar.Position = Office.MsoBarPosition.msoBarTop;  

        }

        private void myButton_Click(CommandBarButton Ctrl, ref bool CancelDefault)
        {
            var explorer = Application.ActiveExplorer();
            if (explorer != null)
            {
                var folder = explorer.CurrentFolder;
                if (folder.DefaultItemType == Microsoft.Office.Interop.Outlook.OlItemType.olAppointmentItem)
                {
                    var cb = explorer.CommandBars.FindControl(myMissing, 1106, myMissing, myMissing);
                    if (cb != null)
                    {
                        cb.Execute();
                        var appointment = (Outlook._AppointmentItem)Application.ActiveInspector().CurrentItem;
                        appointment.Close(Microsoft.Office.Interop.Outlook.OlInspectorClose.olDiscard);
                        
                        var informacoes = string.Format("Inicio: {0}\n Fim: {1}", 
                            appointment.Start.ToString(), 
                            appointment.End.ToString());
                        
                        System.Windows.Forms.MessageBox.Show(informacoes);
                    }
                }
            }
        }

Fica a dica para quem precisar e até a próxima.

Comments