Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Auto shuffle between windows forms every after 5 min

Experts

I would like to shuffle windows forms automatically every after 5 mins. windows forms contains Multiple querys , Multiple videos, Multiple powerpoints.

I am having three windows forms, as follows.

Forms 1 code :

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();
    }
  }
}

Forms 2: Microsoft Powerpoint file

multiple powerpoint files from network folder(path)

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();
    }
  }
}

Forms 3: Multiple video files (MP4,FLV,MOV,etc)

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();
    }
  }
}

Multiple video files from network folder(Path)

Requirement:

Each forms should change and display every after 5 min.

example : first form1 should display then after 5 mins form1 should minimized and form2 should show the slideshow and then after 5 mins form2 should minimized and form3 should play the video and then after 5 mins form3 should minimized and pause the video then form1 should display.

It should keep doing the same steps as above.

Final condition: All forms should stop exactly at 6 pm(Everyday) and it should start automatically at 7 am (Everyday).

Please advise...

like image 545
Leace Avatar asked Sep 14 '18 11:09

Leace


3 Answers

One way is to create base class for forms to control minimizing and maximizing of them and also finding out when the specific form being minimized or maximized by overriding OnStart() and OnStop() methods. This can be done as follow:

Define new base class named 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)
    {
    }
}

Change Program class as follow:

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

Change your forms to inherit CustomForm instead of Form as follow:

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");
    }
}
like image 115
Hossein Golshani Avatar answered Nov 12 '22 05:11

Hossein Golshani


There are a lot of possible ways to do this. Winforms is a Lego box and lets you snap the pieces together any way you want. Deriving your own class from one of the built-in winforms classes is a basic strategy. What you need is a little controller that takes care of the form switching. Best kind of class to override is ApplicationContext. The default one you get is a very simple one that merely ensures that the main form is shown and terminates the app when you close it.

Let's derive our own. This is a potentially heavy-weight app, these are not cheap forms. So we want to specify the forms to switch by their Type instead of their instance, creating and destroying them when the forms gets switched. You'll want the app to terminate whenever the current one is closed by the user. Copy/paste this code into the Program.cs file:

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;
    }
}

Hopefully it is obvious what it does, if not then let me know and I'll add comments. Now you can modify the Main() method in that same file, you pass an instance of this class to the Application.Run() method. I'll copy/paste the code I tested:

    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new FormSwitcher(typeof(Form1), typeof(Form2)));
    }
like image 1
Hans Passant Avatar answered Nov 12 '22 05:11

Hans Passant


Here is sample code that creates the 3 forms, then every 5 seconds switches which is maximized (others are minimized). The application exits when any form is closed. I've put comments throughout, and following it is code you can use to pause playback on forms:

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();
    }
}

Now for forms that need to take action when minimized/maximized, add a Resize handler like this into the code on the form:

    private void Form1_Resize(object sender, EventArgs e)
    {
        if (WindowState == FormWindowState.Minimized)
        {
            //stop any playback
        } else
        {
            //start any playback
        }
    }
like image 1
TheSoftwareJedi Avatar answered Nov 12 '22 04:11

TheSoftwareJedi