Как создать метод для InspectorEvents_10_CloseEventHandler - PullRequest
0 голосов
/ 30 октября 2019

Я создал элемент электронной почты после подготовки электронного письма и открытия окна инспектора. Я получаю визуальный элемент электронной почты после нажатия кнопки Отправить письмо будет перемещено в папку «Исходящие» из Outlook. и окно инспектора закрывается, а приложение Outlook закрывает

, поэтому после этого невозможно создать пространство имен. Мне нужно было освободить ComObjects и поставить все в ноль, если метод send и recive активирован сразу после закрытия окна инспектора, и я получаю ошибки при создании пространства имен, поэтому я подумал о создании таймера для задержки этого.

фоновый работник предназначен для сбора двух сигналов: один, когда дается команда отправки, и один, когда задержка достигнута, тогда будет активирован метод SendReceive ()

У меня есть только одна проблема, и это еслиокно инспектора закрывается вместо отправки, фоновый рабочий не отменяется

, если я смотрю в переменную inspectorWindow, есть закрытие, но это метод. Как создать обработчик событий для закрытия окна инспектора

namespace TrilobesQRCodeReader
{
    public partial class TrilobesQRCodeReader : Form
    {

        /// <summary>
        /// Email is Send Syncronize
        /// </summary>
        bool EmailSendCommand;

        /// <summary>
        /// Boolean is high when delay is ended
        /// </summary>
        bool SyncDelay;

        /// <summary>
        /// 
        /// </summary>
        private Timer SyncDelayTimer;

            private void Email_Click(object sender, EventArgs e)
            {

            Outlook.Application outlookApp = new Outlook.Application();
            Outlook.MailItem oMailItem = (Outlook.MailItem)outlookApp.CreateItem(Outlook.OlItemType.olMailItem);
            Outlook.Recipients oRecips = (Outlook.Recipients)oMailItem.Recipients;

            try
            {
                this.Cursor = Cursors.WaitCursor;
                UpdateCursor();
                List<string> lstAllRecipients = new List<string>();
                //Below is hardcoded - can be replaced with db data
                lstAllRecipients.Add(SqliteDatabase[5]);

                //Create Table for htmlbody
                StringBuilder EmailText = new StringBuilder();
                //add the body of the email
                EmailText.Append("<table border= 1>");
                EmailText.Append("<tr>");
                EmailText.Append("<th>Tag Name</th>");
                EmailText.Append("<th>Component / Description</th>");
                EmailText.Append("<th>Function</th>");
                EmailText.Append("<th>Brand</th>");
                EmailText.Append("<th>Type</th>");
                EmailText.Append("<th>M-Connection</th>");
                EmailText.Append("<th>E-Connection</th>");
                EmailText.Append("<th>Range</th>");
                EmailText.Append("<th>Remark</th>");
                EmailText.Append("<th>Ordering Code</th>");
                EmailText.Append("<th>Panel</th>");
                EmailText.Append("<th>DI</th>");
                EmailText.Append("<th>DO</th>");
                EmailText.Append("<th>AI</th>");
                EmailText.Append("<th>AO</th>");
                EmailText.Append("<th>Ethernet</th>");
                EmailText.Append("<th>ASI</th>");
                EmailText.Append("</tr>");
                EmailText.Append("<tr>");
                EmailText.Append("<td>" + Picker(Items, SQLHeaders[4]) + "</td>");
                EmailText.Append("<td>" + Picker(Items, SQLHeaders[5]) + "</td>");
                EmailText.Append("<td>" + Picker(Items, SQLHeaders[6]) + "</td>");
                EmailText.Append("<td>" + Picker(Items, SQLHeaders[7]) + "</td>");
                EmailText.Append("<td>" + Picker(Items, SQLHeaders[8]) + "</td>");
                EmailText.Append("<td>" + Picker(Items, SQLHeaders[9]) + "</td>");
                EmailText.Append("<td>" + Picker(Items, SQLHeaders[10]) + "</td>");
                EmailText.Append("<td>" + Picker(Items, SQLHeaders[11]) + "</td>");
                EmailText.Append("<td>" + Picker(Items, SQLHeaders[12]) + "</td>");
                EmailText.Append("<td>" + Picker(Items, SQLHeaders[13]) + "</td>");
                EmailText.Append("<td>" + Picker(Items, SQLHeaders[14]) + "</td>");
                EmailText.Append("<td>" + Picker(Items, SQLHeaders[15]) + "</td>");
                EmailText.Append("<td>" + Picker(Items, SQLHeaders[16]) + "</td>");
                EmailText.Append("<td>" + Picker(Items, SQLHeaders[17]) + "</td>");
                EmailText.Append("<td>" + Picker(Items, SQLHeaders[18]) + "</td>");
                EmailText.Append("<td>" + Picker(Items, SQLHeaders[19]) + "</td>");
                EmailText.Append("<td>" + Picker(Items, SQLHeaders[20]) + "</td>");
                EmailText.Append("</tr>");
                EmailText.Append("</table>");

                // Force the "HTMLBody" property to be populated with any email signature, so that we can append it to our content.
                oMailItem.HTMLBody = EmailText.ToString();

                //Add attachments in the E-mail
                foreach (PictureBox pictureBox in MailPictureBoxes)
                {
                    if ((Color)pictureBox.Tag == Color.Red)
                    {

                        System.GC.Collect();
                        System.GC.WaitForPendingFinalizers();
                        if (!FileInUse(pictureBox.ImageLocation))
                        {
                            //Add an attachment.
                            String sDisplayName = pictureBox.Name;
                            int iPosition = (int)oMailItem.Body.Length + 1;
                            int iAttachType = (int)Outlook.OlAttachmentType.olByValue;
                            //now attached the file
                            Outlook.Attachment oAttach = oMailItem.Attachments.Add
                             (pictureBox.ImageLocation, iAttachType, iPosition, sDisplayName);
                        }
                    }
                }

                // Recipient
                foreach (String recipient in lstAllRecipients)
                {
                    Outlook.Recipient oRecip = (Outlook.Recipient)oRecips.Add(recipient);
                    oRecip.Resolve();
                }

                //Add Subject
                oMailItem.Subject = string.Format("116145 Citrofrut ATF Mexico InstrumentationList Item {0}", Picker(Items, SQLHeaders[4]));

                //All Preparation has been done now open Email Item
                outlookApp.ItemSend += new Outlook.ApplicationEvents_11_ItemSendEventHandler(Item_Send);

                //inspectorWindow = oMailItem.GetInspector;
                Outlook.Inspector inspectorWindow = oMailItem.GetInspector;

                //Make the inspectorWindow the active window
                inspectorWindow.Activate();

                //Go back to normal Cursor
                this.Cursor = Cursors.Arrow;
                UpdateCursor();

                //Open Inspector Window
                inspectorWindow.Display(true);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Send Email", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            finally
            {

                if (oRecips != null) Marshal.ReleaseComObject(oRecips);
                oRecips = null;

                if (oMailItem != null) Marshal.ReleaseComObject(oMailItem);
                oMailItem = null;

                if (outlookApp != null) Marshal.ReleaseComObject(outlookApp);
                outlookApp = null;
            }

            if (backgroundWorker1.IsBusy != true)
            {
                // Start the asynchronous operation.
                backgroundWorker1.RunWorkerAsync();
            }

            SyncDelayTimer = new Timer();
            SyncDelayTimer.Interval = 200;
            SyncDelayTimer.Tick += SyncDelayTimer_Tick;
            SyncDelayTimer.Enabled = true;
        }

        private void Item_Send(object Item, ref bool Cancel)
        {
            EmailSendCommand = true;
        }

        private void SyncDelayTimer_Tick(object sender, EventArgs e)
        {
            SyncDelay = true;
        }

        private void SendReceive()
        {
            Outlook.Application outlookApp = new Outlook.Application();

            Outlook.NameSpace nameSpace = outlookApp.GetNamespace("MAPI");
            try
            {
                Outlook.SyncObject mysync = outlookApp.Session.SyncObjects["All Accounts"];
                mysync.Session.SendAndReceive(true);
                //mysync.Progress += new Outlook.SyncObjectEvents_ProgressEventHandler(Sync_Progress);
                //mysync.SyncStart += new Outlook.SyncObjectEvents_SyncStartEventHandler(Sync_Start);
                //mysync.SyncEnd += new Outlook.SyncObjectEvents_SyncEndEventHandler(Sync_End);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "SendRecieve", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            finally
            {               

                if (nameSpace != null) Marshal.ReleaseComObject(nameSpace);
                nameSpace = null;
                if (outlookApp != null) Marshal.ReleaseComObject(outlookApp);
                outlookApp = null;
            }
            backgroundWorker1.CancelAsync();
            EmailSendCommand = false;
            SyncDelay = false;
        }

        private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            System.Threading.Thread.Sleep(500);
            if (EmailSendCommand && SyncDelay)
            {
                SendReceive();
            }
        }
    }
}


...