mafei863分享 http://blog.sciencenet.cn/u/mafei863 道法自然,道即合理

博文

C# WinForm编程常见技巧汇总-视频播放长度获取

已有 3294 次阅读 2015-6-10 12:45 |个人分类:c#编程|系统分类:科研笔记

********  axWindowsMediaPlayer1   结果很可能为0 ********  

private void button9_Click(object sender, EventArgs e)

        {

            axWindowsMediaPlayer1.URL = "2.mp4";

            frameNum = 0;

            timer1.Enabled = true;

         }

        /// <summary>

        /// 可能因为媒体文件的打开需要一定时间,这里等待媒体文件的打开

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void timer1_Tick(object sender, EventArgs e)

        {

            if(this.axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPlaying)

            {

                //Thread.Sleep(2000);

                frameNum = axWindowsMediaPlayer1.currentMedia.duration;

                if (frameNum > 0)

                {

                    setTextBoxControlString(this.textBox1, axWindowsMediaPlayer1.currentMedia.name + ", frameNum=" + frameNum);

                    timer1.Enabled = false;

                }

     

            }

        }


1、vs2005隐藏窗体

在窗体属性中,设置

  windowState为minimized

  showInTaskBar为false

隐藏窗体

 

2、C#窗口中创建了线程,关闭窗口,进程无法结束的问题

问题:WinForm窗口,点击了右上角的关闭按钮,窗口是关了,但是进程仍然存在,需要手工结束进程。

原因:因为窗口运行的时候创建了前台线程,而前台线程会阻止进程终止,所以即使当窗口关闭但是进程一直无法结束。

解决方法:创建线程的时候,将线程的IsBackground属性设置成true,就可以了。


3、

解决C# WinForm 中 VSHOST.EXE 程序不关闭的问题 (2013-08-16 14:24:29)

转载

标签: it分类: 软件开发理论

右击“解决方案”--属性-调试栏-启用调试器部分-“启用Visual studio宿主进程”不勾选

如果让vs不生成这些“垃圾”(还有相应的批准文件.vshost.exe.config),可以这样来设置:项目→“某项目”属性→ 调试,將 “启用the Visual Studio 宿主进程”選項前的勾勾取消即可。

4、  C# WinForm中禁止改变窗口大小的方法


在Form类下面有一个FormBorderStyle的字段,我们可以通过设置它的值来让窗体不能被拉大拉小。FormBorderStyle的值设置为FormBorderStyle.FixedSingle或Fixed3D时,窗体大小是不能被改变的。

当然,还有一种情况,我们也应该要考虑到,那就是窗体最大化。所以,我们要将窗体最大化的功能去掉,即this.MaximizeBox = false;。


5、 指定窗口显示位置的方法


this.Top = SystemInformation.WorkingArea.Height / 3;

           this.Left = SystemInformation.WorkingArea.Width / 3  ;



6、C# 设置电脑关机、重启、注销、锁定、关闭显示器的类(支持win7,win8)


[DllImport("user32")]
      public static extern bool ExitWindowsEx(uint uFlags,uint dwReason);
      [DllImport("user32")]
      public static extern void LockWorkStation();
      [DllImport("user32")]
      public static extern int SendMessage(int hWnd,int hMsg,int wParam,int lParam);
      public enum MonitorState
      {
          MonitorStateOn=-1,
          MonitorStateOff=2,
          MonitorStateStandBy=1
      }
      public static void ShutDown()
      {
          try
          {
              System.Diagnostics.ProcessStartInfo startinfo = new System.Diagnostics.ProcessStartInfo("shutdown.exe", "-s -t 00");
              System.Diagnostics.Process.Start(startinfo);
          }
          catch { }
      }
      public static void Restart()
      {
          try
          {
              System.Diagnostics.ProcessStartInfo startinfo = new System.Diagnostics.ProcessStartInfo("shutdown.exe", "-r -t 00");
              System.Diagnostics.Process.Start(startinfo);
          }
          catch { }
      }
      public static void LogOff()
      {
          try
          {
              ExitWindowsEx(0, 0);
          }
          catch { }
      }
      public static void LockPC()
      {
          try
          {
              LockWorkStation();
          }
          catch { }
      }
      public static void Turnoffmonitor()
      {
          SetMonitorInState(MonitorState.MonitorStateOff);
      }
      private static void SetMonitorInState(MonitorState state)
      {
          SendMessage(0xFFFF, 0x112, 0xF170, (int)state);
      }

网页加载完毕后触发事件

1、WebBrowser载入一个页面后DocumentCompleted事件会执行两次,但这两次的ReadyState状态不一样,分别是Intercative和Complete。而MSDN对这两种状态值的解释是:Complete该控件已完成新文档及其所有内容的加载;Interactive该控件已经加载足够的文档以允许有限的用户交互,比如单击已显示的超链接。由此可见,实际上DocumentCompleted事件会在Interactive状态和Complete状态各调用一次,那么我们可以根据我们的需要来判断到底需要那一次。解决办法实例代码如下:

复制代码代码如下:


if(webBrowser1.ReadyState!=WebBrowerReadyState.Complete)
   return;


private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)

       {

           //1、若不知道网页中控件的ID(name),则可以通过查看控件的起始坐标也可以

         

           if (webBrowser1.ReadyState ==WebBrowserReadyState.Complete)

           {

               try

               {

                   webBrowser1.Document.GetElementById("username").InnerText = this.textBox2.Text.Trim();

                   webBrowser1.Document.GetElementById("password").InnerText = this.textBox3.Text.Trim();

                   webBrowser1.Document.GetElementById("loginBtn").InvokeMember("click");

                 

               }

               catch (Exception ex)

               {

                   //this.textBox1.Text = ex.ToString();


               }

           }

       }



8. C#中Application.DoEvents()的作用

Visual Studio里的摘要:处理当前在消息队列中的所有 Windows 消息。

交出CPU控制权,让系统可以处理队列中的所有Windows消息,比如在大运算量循环内,加Application.DoEvents可以防止界面停止响应,因为winform的消息循环是一个线程来处理,那么假如你的某个操作比较耗时,那么消息处理得等你这个耗时操作做完了才能继续,而Application.DoEvents方法就是允许你在耗时操作的内部调用它,而去处理消息队列中的消息。像鼠标移动鼠标点击都是windows消息,如果耗时操作一直进行,那么界面就像死锁一样

       private void button1_Click(object sender, EventArgs e)

       {

           for (int i = 0; i < 10000; i++)

           {

               label1.Text = i.ToString();

               Application.DoEvents();

           }

       }

 测试了一下,没有Application.DoEvents()的时候,Label基本处于假死机状态,最后显示一个9999,加上后会数字变换正常显示。

从这个测验后DoEvents的功能,应该DoEvents就好比实现了进程的同步。在不加的时候,因为优先级的问题,程序会执行主进程的代码,再执行代码,而加了以后就可以同步执行。

     private void Delay(int Millisecond)

       {

           DateTime current = DateTime.Now;

           while (current.AddMilliseconds(Millisecond) > DateTime.Now)

           {

               Application.DoEvents();      

           }

           return;

       }

9.

C# WinForm程序完全退出的问题解决

作者: 字体:[增加 减小] 类型:转载 时间:2013-05-22 我要评论

C# WinForm程序完全退出的问题解决,需要的朋友可以参考一下

1.this.Close();   只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出;

2.Application.Exit();  强制所有消息中止,退出所有的窗体,但是若有托管线程(非主线程),也无法干净地退出;

3.Application.ExitThread(); 强制中止调用线程上的所有消息,同样面临其它线程无法正确退出的问题;

4.System.Environment.Exit(0);   这是最彻底的退出方式,不管什么线程都被强制退出,把程序结束的很干净。

5.Application.Restar();  注销 开启新实例




https://blog.sciencenet.cn/blog-538909-896904.html

上一篇:科学——分科的学问
下一篇:Gabor滤波器原理的初步理解
收藏 IP: 125.220.157.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-26 01:45

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部