"Как заставить Windows формы общаться с Microsoft Office?" - PullRequest
0 голосов
/ 07 июля 2019

Мои программы отлично работают с использованием горячих клавиш для изменения текста в Microsoft Word, Powerpoint, Excel и Outlook.

Единственная проблема, с которой я столкнулся, заключается в том, что программа не запустится, если я не нажму на нее мышью или не использую Alt и Tab для переключения между моей программой и программами Microsoft Office.

Я не хочу использовать мышь или использовать Alt и Tab. У меня есть сценарий с подключением клавиатуры для копирования горячих клавиш, но он будет работать только в том случае, если Windows видит мою программу поверх всего и активна.

Моя программа превыше всего, но при переходе на Microsoft Word (например) моя программа больше не активна, а Microsoft Word теперь активен. Мне нужно было бы перейти к моей программе, чтобы сделать ее активной, щелкнув по ней мышью или используя Alt и Tab, выполнить горячую клавишу и затем вернуться в Microsoft Word, используя мою мышь, чтобы щелкнуть по ней, или используя Alt и Tab, чтобы сделать активно использовать горячую клавишу, которая была нажата.

С этим, как я могу сделать свою программу общим плагином для Microsoft Office, где Microsoft Office будет распознавать мою программу?

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Вот мой код для просмотра, чтобы вы поняли, что я делаю.Извините, я пытался поместить это как комментарий, но это было слишком долго.

//MICROSOFT WORD INTEGRATION
        try
        {
            app = (Microsoft.Office.Interop.Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
            app.ActiveWindow.Selection.Font.Color = (Microsoft.Office.Interop.Word.WdColor)(changeColor.R + 0x100 * changeColor.G + 0x10000 * changeColor.B);
        }
        catch (System.Exception excp)
        {

        }
        //MICROSOFT EXCEL INTEGRATION
        try
        {
            xlApp = (Microsoft.Office.Interop.Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
            xlBook = xlApp.ActiveWorkbook;
            xlSheet = xlBook.ActiveSheet;
            Microsoft.Office.Interop.Excel.Range rngSelection = xlApp.Selection as Microsoft.Office.Interop.Excel.Range;
            for (var r = 1; r <= rngSelection.Rows.Count; r++)
            {
                for (var c = 1; c <= rngSelection.Columns.Count; c++)
                {
                    rngSelection[r, c].Font.Color = copyProgramText.SelectionColor;
                }
            }

        }
        catch (System.Exception excp)
        {

        }
        //MICROSOFT POWERPOINT INTEGRATION
        try
        {
            pwptApp = (Microsoft.Office.Interop.PowerPoint.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("PowerPoint.Application");
            pwptApp.ActiveWindow.Selection.TextRange.Font.Color.RGB = System.Drawing.ColorTranslator.ToOle(changeColor);
            if (pwptApp.ActiveWindow.Selection.TextRange.Text.Trim() == "") pwptApp.ActiveWindow.Selection.TextRange.Text = " ";
        }
        catch (System.Exception excp)
        {

        }
        //MICROSOFT OUTLOOK INTEGRATION
        try
        {
            Microsoft.Office.Interop.Outlook.Application otlkApp = (Microsoft.Office.Interop.Outlook.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Outlook.Application");
            Microsoft.Office.Interop.Outlook.Explorer otlkExp = otlkApp.ActiveExplorer();
            Microsoft.Office.Interop.Outlook.Selection otlkSel = otlkExp.Selection;
            Microsoft.Office.Interop.Outlook.MailItem otlkMsg = otlkApp.ActiveInspector().CurrentItem as Microsoft.Office.Interop.Outlook.MailItem;
            Microsoft.Office.Interop.Outlook.Inspector insp = otlkMsg.GetInspector;

            Microsoft.Office.Interop.Word.Document otlkDoc = (Microsoft.Office.Interop.Word.Document)insp.WordEditor;

            string sepSel = otlkDoc.Application.Selection.Text;
            byte rColor = changeColor.R;
            byte gColor = changeColor.G;
            byte bColor = changeColor.B;
            if (sepSel.Trim() == "\r") return;
            char cReturn = (char)13;
            if (sepSel == cReturn.ToString()) return;
            if (sepSel != "")
            {
                otlkMsg.HTMLBody = otlkMsg.HTMLBody.Replace(sepSel, "<font style = 'color: rgb(" + rColor.ToString() + ", " + gColor.ToString() + ", " + bColor.ToString() + ")'>" + sepSel + " </font>");
            }
            else
            {
                return;
            }

            prevOutlookContents = otlkMsg.HTMLBody;

        }
        catch (System.Exception excp)
        {

        }
0 голосов
/ 07 июля 2019

Прежде всего, вы можете автоматизировать Outlook из других приложений.В связи с тем, что Outlook является одноэлементным, в системе одновременно может быть запущен только один экземпляр приложения.Таким образом, вы можете получить работающий экземпляр из ROT:

//Get reference to Outlook.Application from the ROT.
oApp =  (Outlook.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Outlook.Application");

Если в системе не запущен Outlook, вы можете просто создать новый.См. Приложение C # для автоматизации Outlook (CSAutomateOutlook) для получения дополнительной информации.

...