代码之家  ›  专栏  ›  技术社区  ›  Leace

每隔5分钟在windows窗体之间自动洗牌一次

  •  9
  • Leace  · 技术社区  · 6 年前

    我想自动洗牌windows窗体每5分钟后。windows窗体包含多个查询、多个视频和多个powerpoints。

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

    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分钟后,每个窗体都应更改并显示一次。

    它应该继续执行与上面相同的步骤。

    最终条件:所有表格应在下午6点(每天)完全停止,并应在早上7点(每天)自动启动。

    请告知。。。

    3 回复  |  直到 6 年前
        1
  •  2
  •   Hossein Golshani    6 年前

    一种方法是为窗体创建基类来控制它们的最小化和最大化,还可以通过重写找出特定窗体何时最小化或最大化 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();
        }
    }
    

    更改窗体以继承 自定义窗体 而不是 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();
        }
    }
    

    表格2:

    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");
        }
    }
    
        2
  •  1
  •   Hans Passant    6 年前

    有很多方法可以做到这一点。Winforms是一个乐高积木盒,可以让你按你想要的方式把这些积木拼合在一起。从一个内置winforms类派生您自己的类是一个基本策略。你需要的是一个小控制器,负责窗体切换。最好重写的类是ApplicationContext。你得到的默认值是一个非常简单的值,它只确保主窗体被显示,并在你关闭应用程序时终止它。

    让我们自己来推导。这是一个潜在的重磅应用程序,这些都不是廉价的形式。因此,我们希望通过类型而不是实例来指定要切换的窗体,在窗体切换时创建和销毁它们。当用户关闭当前应用程序时,您将希望该应用程序终止。将此代码复制/粘贴到程序.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;
        }
    }
    

        [STAThread]
        static void Main() {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FormSwitcher(typeof(Form1), typeof(Form2)));
        }
    
        3
  •  1
  •   TheSoftwareJedi jac    6 年前

    下面是创建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();
        }
    }
    

    现在,对于需要在最小化/最大化时执行操作的窗体,请在窗体上的代码中添加如下调整大小处理程序:

        private void Form1_Resize(object sender, EventArgs e)
        {
            if (WindowState == FormWindowState.Minimized)
            {
                //stop any playback
            } else
            {
                //start any playback
            }
        }