Auto shuffle between windows forms every after 5 min
Asked Answered
I

3

8

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...

Integument answered 14/9, 2018 at 11:31 Comment(15)
what do you mean by shuffling? bring to front? change their content?Delagarza
i mean first 5 min form1 should display and then form1 should minimized then form2 should display and then form2 should minimized then form3 should open . this all should happen every after 5 min..Integument
@Integument you didn't post any relevant code. That's a SQL query while you ask about Windows Forms. Have you tried something? Do you know how to play videos, display embedded powerpoint slideshows etc or are you asking about that as well?Skate
@PanagiotisKanavos i am sorry i am lacking code for form2 and fom3 which is pertains to powerpoint slidshow and video display. let me know if you have any codings for the same..Integument
@PanagiotisKanavos find attached codingsIntegument
Hello friends can you help...Integument
So basically you want to alt tab between the forms, every five minuts?Figureground
Exactly but. Powerpoint & Video should pause during alt + tab and resume whenever there turn comesIntegument
Experts is there anything wrong. Other friends are suggesting there solutions but its keep disappearing. Please advise..Integument
And what should happen when the video or presentation finishes?Proprietary
Conditions 1 : If its one video & one power point then it should replay. Condtion2 : if its multiple video and & multiple powerpoint then it should go to next video and next powerpointIntegument
And what should happen when you click(manually) a minimized form while other is still open? It starts to get complicating isn't it?Proprietary
It can be open but should be minimized and required one should be maximized. Mostly i will go with Conditions 1 in that case it will not have much issueIntegument
I dont understand. eg form2 plays powerpoint and form3 is clicked and opens. What should happen to these forms?Proprietary
Let us continue this discussion in chat.Integument
D
2

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");
    }
}
Darrendarrey answered 20/9, 2018 at 16:20 Comment(5)
Thanks but video is not getting pause also powerpoint too.pls adviseIntegument
@Integument - To star video use axWindowsMediaPlayer1.URL = @"C:\ok.mp4"; and to stop it just do axWindowsMediaPlayer1.URL = "";. Check updated answer.Darrendarrey
: Almost we are close by to accomplish our mission.Let me know your convenient time to tweak the error. " Nothing is Impossible"Integument
Sorry. I was involved with other issues. I am at your service.Darrendarrey
Hi can you come to chat by clicking aboveIntegument
V
1

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)));
    }
Viscometer answered 14/9, 2018 at 11:31 Comment(3)
Thanks for assisting me. Is it possible in this way. Form1 should not close instead it can minimize and then maximize when it turn comes. And form2 video should pause and then maximize with resume when it turn comes. same way powerpoint should pause and then maximize with resume when turn comes.Integument
Modify it the way you want. I did try to emphasize that keeping these form objects alive was not a good idea since they are so expensive. In fact, I recommend you add GC.Collect() after the Close() call, pretty important to tame PowerPoint.Viscometer
i am unable to do in my way . can you help me with above.Integument
A
1

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
        }
    }
Adiathermancy answered 18/9, 2018 at 14:45 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.