Таймер C# WinForms зависает/зависает при создании моего Office.Interop.PowerPointC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Таймер C# WinForms зависает/зависает при создании моего Office.Interop.PowerPoint

Сообщение Anonymous »

Создавая презентации PowerPoint в C# Visual Studio, я понял, что у меня зависает таймер WinForm; Я даже не могу перемещать свое приложение по экрану. Есть ли способ создать PowerPoint в фоновом режиме?
Чтобы проиллюстрировать проблему, у меня есть этот пример кода в «C:\myPowerPointHangs» для C# Windows Forms .NET
Я добавил из Диспетчера ссылок>COM>Библиотеки типов ссылку на сборку «Библиотека объектов Microsoft Office 16.0» (версия 2.8) или также из NuGet: «Microsoft.Office.Interop.PowerPoint» (версия 15.0.4420.1018) добавлен в мой проект...
Я создал два таймера.
  • Таймер1 покажет подсчет шагов за 100 мс в заголовке моей WinForm и запустит Таймер2 в 2000 миллисекунды, затем продолжайте отсчет.
  • Таймер2 срабатывает один раз. Он создает слайд и матрицу блоков. Это занимает несколько секунд. Наконец, он сохраняет презентацию. После этого моя WinForm снова жива.

Код: Выделить всё

// Project>Add Reference>COM>Type Libraries>Microsoft Office 16.0 Object Library
// Tools>NuGet Package Manager>Manage NuGet Packages for solution>Microsoft.Office.Interop.PowerPoint 15.0.4420.1018
using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using Office = Microsoft.Office.Core;
using State = Microsoft.Office.Core.MsoTriState;
using System;
using System.Windows.Forms;

namespace myPowerPointHangs
{
public partial class Form1 : Form
{
readonly float u = 72.0f; // Inches
int t = 0;
int t0 { get => (++t); set => t = 0; }
string fileName = @"C:\myPowerPointHangs\mySlides.ppt";
public Form1() { InitializeComponent(); timer1.Start(); }
private void timer1_Tick(object sender, EventArgs e)
{
this.Text = t0.ToString() + "00ms";
if (t == 20) timer2.Start();
}

private void timer2_Tick(object sender, EventArgs e)
{
timer2.Stop();
PowerPoint.Application pptApplication = new PowerPoint.Application();
PowerPoint.Presentation ppt;
PowerPoint.Slide slide;
PowerPoint.Slides slides;
Office.MsoAutoShapeType shape;
ppt = pptApplication.Presentations.Add(State.msoTrue);
slides = ppt.Slides;
slides.Application.Caption = "mySlides";
slide = slides.Add(1, PowerPoint.PpSlideLayout.ppLayoutBlank);
shape = Office.MsoAutoShapeType.msoShapeFlowchartTerminator;

float left = 6.61f * u;
for (int col = 0; col < 5; col++)
{
float top = 0.1f * u;
for (int row = 0; row < 20; row++)
{
slide.Shapes.AddShape(shape, left, top, 0.77f * u, 0.23f * u);
int i = slide.Shapes.Count;
slide.Shapes[i].Fill.ForeColor.RGB = System.Drawing.ColorTranslator.ToWin32(System.Drawing.Color.White);
slide.Shapes[i].Line.ForeColor.RGB = System.Drawing.ColorTranslator.ToWin32(System.Drawing.Color.FromArgb(58, 58, 58));
slide.Shapes[i].TextFrame.TextRange.Font.Color.RGB = System.Drawing.ColorTranslator.ToWin32(System.Drawing.Color.FromArgb(19, 40, 79));
slide.Shapes[i].TextFrame.TextRange.Font.Size = 6.0f;
slide.Shapes[i].TextFrame.WordWrap = State.msoFalse;
slide.Shapes[i].TextFrame.TextRange.Text = col.ToString("00")+row.ToString("00");
top += slide.Shapes[i].Height + 0.02f * u;
}
left += slide.Shapes[slide.Shapes.Count].Width + 0.05f * u;
}

if (System.IO.File.Exists(fileName)) System.IO.File.Delete(fileName);
ppt.SaveAs(fileName, PowerPoint.PpSaveAsFileType.ppSaveAsPresentation, Office.MsoTriState.msoCTrue);
ppt.Close();
}
}
}
Здесь и там есть похожие темы, но они не отвечают на мой вопрос: как запустить Office.Interop.PowerPoint в фоновом режиме, не зависая моего приложения WinForm?
Кроме того, если по какой-либо причине мы откроем всплывающее сообщение в приложении PowerPoint до или во время создания презентации, будет сгенерировано исключение:

Код: Выделить всё

System.Runtime.InteropServices.COMException: 'Call was rejected by callee. (Exception from HRESULT: 0x80010001
Opening_PowerPoint_Popup => Call_was_rejected_by_callee

Подробнее здесь: https://stackoverflow.com/questions/792 ... -powerpoin
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Таймер C# WinForms зависает/зависает при создании моего Office.Interop.PowerPoint
    Anonymous » » в форуме C#
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Таймер C# WinForms зависает/зависает при создании моего Office.Interop.PowerPoint
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Таймер C# WinForms зависает/зависает при создании моего Office.Interop.PowerPoint
    Anonymous » » в форуме C#
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Office.Interop.Excel и Office.Interop.Outlook Развертывание по щелчку мыши и Windows 11
    Anonymous » » в форуме C#
    0 Ответы
    38 Просмотры
    Последнее сообщение Anonymous
  • Как создать Microsoft.Office.Interop.PowerPoint.ColorFormat
    Anonymous » » в форуме C#
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»