Авто тасование между окнами формы каждые 5 минут - PullRequest
0 голосов
/ 14 сентября 2018

Эксперты

Я бы хотел перетасовывать формы окон автоматически каждые 5 минут.Windows формы содержит несколько запросов, несколько видео, несколько точек электропитания.

У меня есть три формы окна, как показано ниже.

Форма 1 код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Daily_System {
  public partial class Form1: Form {
    public Form1() {
      InitializeComponent();
      timer1.Enabled = true;
      timer1.Interval = 5000;
      timer1.Tick += timer1_Tick;
      timer1.Start();
    }

    private void Form1_Load(object sender, EventArgs e) {
      this.WindowState = FormWindowState.Maximized;

      CenterToScreen();
    }

    private Timer timer1 = new Timer();


    private void button1_Click_1(object sender, EventArgs e) {
      this.WindowState = FormWindowState.Minimized;
      Form2 f = new Form2(); // This is bad
      timer2.Enabled = true;
    }
    private void timer2_Tick(object sender, EventArgs e) {
      button1.PerformClick();
    }
  }
}

Формы 2: файл Microsoft Powerpoint

несколько файлов powerpoint из сетевой папки (путь)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using Core = Microsoft.Office.Core;

namespace Daily_System {

  public partial class Form2: Form {


    public Form2() {
      InitializeComponent();


      this.WindowState = FormWindowState.Minimized;
      timer1.Enabled = true;
      timer1.Interval = 15000;
      timer1.Start();

    }


    private void Tick(object sender, EventArgs e) {
      Form3 Next = new Form3();
      Next.Show();
      this.Hide();
      timer1.Stop(); //Stop timer after tick once
    }




    protected override void OnLoad(EventArgs e)

    {

      base.OnLoad(e);

      this.BeginInvoke(new MethodInvoker(delegate() {
        button1.PerformClick();
      }));


    }



    private void button1_Click(object sender, EventArgs e) {
      Microsoft.Office.Interop.PowerPoint.Application pptApp = new Microsoft.Office.Interop.PowerPoint.Application();
      Microsoft.Office.Core.MsoTriState ofalse = Microsoft.Office.Core.MsoTriState.msoFalse;
      Microsoft.Office.Core.MsoTriState otrue = Microsoft.Office.Core.MsoTriState.msoTrue;

      pptApp.Visible = otrue;
      pptApp.Activate();
      Microsoft.Office.Interop.PowerPoint.Presentations ps = pptApp.Presentations;


      var opApp = new Microsoft.Office.Interop.PowerPoint.Application();
      pptApp.SlideShowEnd += PpApp_SlideShowEnd;
      var ppPresentation = ps.Open(@ "C:\Users\ok\Downloads\Parks-WASD2017.pptx", ofalse, ofalse, otrue);
      var settings = ppPresentation.SlideShowSettings;
      settings.Run();
    }



    private void PpApp_SlideShowEnd(Microsoft.Office.Interop.PowerPoint.Presentation Pres) {
      Pres.Saved = Microsoft.Office.Core.MsoTriState.msoTrue;
      Pres.Close();

    }

    private void Form2_Load(object sender, EventArgs e) {

    }

    private void button2_Click(object sender, EventArgs e) {
      this.WindowState = FormWindowState.Minimized;
      Form3 f = new Form3(); // This is bad
      f.Show(); /// f.Show();
      timer1.Enabled = true;
      this.Hide();
      timer1.Stop(); //Stop timer after tick once

    }

    private void timer1_Tick_1(object sender, EventArgs e) {
      button2.PerformClick();
    }
  }
}

Формы 3: несколько видеофайлов (MP4, FLV, MOV и т. Д.)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Daily_System {

  public partial class Form3: Form {

    public Form3() {
      InitializeComponent();
      timer1.Enabled = true;
      timer1.Interval = 15000;
      timer1.Start();

    }

    private void Form3_Load(object sender, EventArgs e) {
      axWindowsMediaPlayer1.settings.autoStart = true;
    }



    private void axWindowsMediaPlayer1_Enter_1(object sender, EventArgs e) {

      axWindowsMediaPlayer1.URL = @ "C:\Users\ok\Downloads\ok.mp4";
    }





    private void button1_Click(object sender, EventArgs e) {


      this.WindowState = FormWindowState.Minimized;
      Form1 f = new Form1(); // This is bad
      f.Show(); /// f.Show();
      timer1.Enabled = true;
      this.Hide();
      timer1.Stop(); //Stop timer after tick once

    }

    private void timer1_Tick_1(object sender, EventArgs e) {
      button1.PerformClick();
    }
  }
}

Несколько видеофайлов из сетевой папки (путь)

Требование:

Каждая форма должна меняться и отображаться каждые 5 минут.

пример: первая форма 1 должна отображаться, затем через 5 минут форма 1 должна быть свернута, а форма 2 должна показывать слайд-шоу, а затем через 5 минут форма 2 должна быть свернута, а форма 3 должна воспроизводить видео, а затем через 5 минут форма 3 должна быть свернута и приостановлена.тогда должна отобразиться форма 1.

Она должна продолжать выполнять те же шаги, что и выше.

Конечное условие: все формы должны остановиться ровно в 18:00 (каждый день), и это должноначать автоматически в 7 часов утра (каждый день).

Пожалуйста, сообщите ...

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Вот пример кода, который создает 3 формы, затем каждые 5 секунд переключается, что максимально (другие свернуты).Приложение закрывается при закрытии любой формы.Я поместил комментарии повсюду, и следуя за этим кодом, вы можете использовать, чтобы приостановить воспроизведение на формах:

internal static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    private static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        //here we create our 3 forms.  note, you can create and show as many as you want here
        //the application will automatically loop through them
        new Form1().Show();
        new Form2().Show();
        new Form().Show();

        //minimize all forms, and set a close handler
        foreach (Form form in Application.OpenForms)
        {
            form.WindowState = FormWindowState.Minimized;
            form.FormClosed += Form_FormClosed;
        }

        //start a thread to manage switching them
        Task.Run((Action)Go);

        //start the main UI thread loop
        Application.Run();
    }

    private static void Go()
    {
        while (true)
        {
            //loop through all forms
            foreach (Form form in Application.OpenForms)
            {
                //show it (send execution to UI thread)
                form.Invoke(new MethodInvoker(() =>
                {
                    form.Show();
                    form.WindowState = FormWindowState.Maximized;
                }));

                //wait 5 seconds
                Thread.Sleep(5000);

                //minimize it (send execution to UI thread)
                form.Invoke(new MethodInvoker(() =>
                {
                    form.WindowState = FormWindowState.Minimized;
                }));
            }
        }
    }

    private static void Form_FormClosed(object sender, FormClosedEventArgs e)
    {
        Application.Exit();
    }
}

Теперь для форм, которые должны действовать, когда свернуты / развернуты, добавьте обработчик Resize, как это вкод на форме:

    private void Form1_Resize(object sender, EventArgs e)
    {
        if (WindowState == FormWindowState.Minimized)
        {
            //stop any playback
        } else
        {
            //start any playback
        }
    }
0 голосов
/ 20 сентября 2018

Один из способов - создать базовый класс для форм, чтобы контролировать их минимизацию и максимизацию, а также выяснить, когда конкретная форма минимизируется или максимизируется путем переопределения методов OnStart() и OnStop().Это можно сделать следующим образом:

Определить новый базовый класс с именем CustomForm:

public class CustomForm : Form
{
    public static List<CustomForm> AllForms = new List<CustomForm>();
    private static int CurrentFormIndex = 0;
    private static Timer SliderTimer = new Timer() { Interval = 5000 }; // { Interval = 5 * 60000 };

    public static void Start(params CustomForm[] forms)
    {
        AllForms.AddRange(forms);

        forms[0].Show();
        forms[0].WindowState = FormWindowState.Maximized;
        AllForms[0].OnStart(AllForms[0]);

        SliderTimer.Tick += SliderTimer_Tick;
        SliderTimer.Start();
    }

    private static void SliderTimer_Tick(object sender, EventArgs e)
    {
        SliderTimer.Stop();

        // Minimizing current form
        AllForms[CurrentFormIndex].OnStop(AllForms[CurrentFormIndex]);
        AllForms[CurrentFormIndex].WindowState = FormWindowState.Minimized;

        // Maximizing next form
        int NextFormIndex = (CurrentFormIndex + 1) % AllForms.Count;
        if (!AllForms[NextFormIndex].Visible)
            AllForms[NextFormIndex].Show();
        AllForms[NextFormIndex].WindowState = FormWindowState.Maximized;
        AllForms[NextFormIndex].OnStart(AllForms[NextFormIndex]);

        CurrentFormIndex = NextFormIndex;

        SliderTimer.Start();
    }

    // Application will exits when one of forms being closed
    protected override void OnFormClosed(FormClosedEventArgs e)
    {
        base.OnFormClosed(e);
        Application.Exit();
    }

    // For overriding in forms to Start something such as playing or etc
    protected virtual void OnStart(CustomForm Sender)
    {
    }

    // For overriding in forms to Stop something such as playing or etc
    protected virtual void OnStop(CustomForm Sender)
    {
    }
}

Изменить класс Program следующим образом:

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        CustomForm.Start(new Form1(), new Form2(), new Form3());
        Application.Run();
    }
}

Изменить свойформы для наследования CustomForm вместо Form следующим образом:

public partial class Form1 : CustomForm
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Shown(object sender, EventArgs e)
    {
        // axWindowsMediaPlayer1.URL = @"C:\Users\ok\Downloads\ok.mp4";
        WMPLib.IWMPMedia v1 = axWindowsMediaPlayer1.newMedia(@"d:\1.mp4");
        axWindowsMediaPlayer1.currentPlaylist.appendItem(v1);
        WMPLib.IWMPMedia v2 = axWindowsMediaPlayer1.newMedia(@"d:\2.mp4");
        axWindowsMediaPlayer1.currentPlaylist.appendItem(v2);
        WMPLib.IWMPMedia v3 = axWindowsMediaPlayer1.newMedia(@"d:\3.mp4");
        axWindowsMediaPlayer1.currentPlaylist.appendItem(v3);
    }

    // To start playing video and etc when form being maximized
    protected override void OnStart(CustomForm Sender)
    {
        axWindowsMediaPlayer1.Ctlcontrols.play();
    }

    // To stop playing video and etc when form being minimized
    protected override void OnStop(CustomForm Sender)
    {
        axWindowsMediaPlayer1.Ctlcontrols.pause();
    }
}

Form2:

public partial class Form2 : CustomForm
{
    Microsoft.Office.Interop.PowerPoint.Presentation ppPresentation;
    Microsoft.Office.Interop.PowerPoint.SlideShowSettings settings;
    Microsoft.Office.Interop.PowerPoint.Application opApp;
    int StartingSlide = 1;

    public Form2()
    {
        InitializeComponent();
    }

    protected override void OnStart(CustomForm Sender)
    {
        Microsoft.Office.Interop.PowerPoint.Application pptApp = new Microsoft.Office.Interop.PowerPoint.Application();
        Microsoft.Office.Core.MsoTriState ofalse = Microsoft.Office.Core.MsoTriState.msoFalse;
        Microsoft.Office.Core.MsoTriState otrue = Microsoft.Office.Core.MsoTriState.msoTrue;

        pptApp.Visible = otrue;
        pptApp.Activate();
        Microsoft.Office.Interop.PowerPoint.Presentations ps = pptApp.Presentations;

        opApp = new Microsoft.Office.Interop.PowerPoint.Application();
        opApp.SlideShowNextSlide += OpApp_SlideShowNextSlide;
        ppPresentation = ps.Open(@"c:\a.pptx", ofalse, ofalse, otrue);
        settings = ppPresentation.SlideShowSettings;

        settings.RangeType = Microsoft.Office.Interop.PowerPoint.PpSlideShowRangeType.ppShowSlideRange;
        settings.StartingSlide = StartingSlide;

        settings.Run();
    }

    private void OpApp_SlideShowNextSlide(Microsoft.Office.Interop.PowerPoint.SlideShowWindow Wn)
    {
        StartingSlide = Wn.View.CurrentShowPosition;
    }

    protected override void OnStop(CustomForm Sender)
    {
        ppPresentation.Close();
        //opApp.Quit();
        Process.Start("cmd", "/c taskkill /im POWERPNT.EXE");
    }
}
0 голосов
/ 18 сентября 2018

Есть много возможных способов сделать это.Winforms - это коробка Lego, которая позволяет вам соединять части по своему усмотрению.Извлечение вашего собственного класса из одного из встроенных классов winforms является основной стратегией.Что вам нужно, это маленький контроллер, который заботится о переключении форм.Лучший вид переопределения класса - ApplicationContext.По умолчанию вы получаете очень простую, которая просто обеспечивает отображение главной формы и завершает работу приложения, когда вы закрываете ее.

Давайте выведем нашу собственную.Это потенциально тяжелое приложение, это не дешевые формы.Поэтому мы хотим указать формы для переключения по их типу, а не по экземпляру, создавая и уничтожая их при переключении форм.Вы хотите, чтобы приложение закрывалось всякий раз, когда текущий закрывается пользователем.Скопируйте / вставьте этот код в файл Program.cs:

class FormSwitcher : ApplicationContext {
    Timer switcher;
    Type[] forms;
    int formIndex;
    Form currentForm;
    bool switching;

    public FormSwitcher(params Type[] forms) {
        this.forms = forms;
        switcher = new Timer() { Enabled = true };
        switcher.Interval = System.Diagnostics.Debugger.IsAttached ? 3000 : 5 * 60000;
        switcher.Tick += SwitchForm;
        formIndex = -1;
        SwitchForm(this, EventArgs.Empty);
    }
    private void SwitchForm(object sender, EventArgs e) {
        switching = true;
        formIndex += 1;
        if (formIndex >= forms.Length) formIndex = 0;
        var newform = (Form)Activator.CreateInstance(forms[formIndex]);
        newform.FormClosed += delegate { if (!switching) this.ExitThread(); };
        if (currentForm != null) {
            newform.StartPosition = FormStartPosition.Manual;
            newform.Bounds = currentForm.Bounds;
        }
        newform.Show();
        if (currentForm != null) currentForm.Close();
        currentForm = newform;
        switching = false;
    }
}

Надеюсь, очевидно, что он делает, если нет, то дайте мне знать, и я добавлю комментарии.Теперь вы можете изменить метод Main () в том же файле, передав экземпляр этого класса методу Application.Run ().Я скопирую / вставлю проверенный код:

    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new FormSwitcher(typeof(Form1), typeof(Form2)));
    }
...