需求:为控制会议时间,采取ppt幻灯片播放倒计时的办法,倒计时5分钟。

分析:用EnumWindows枚举窗口,发现PPT窗口类名有三种:PP12FrameClass、MS-SDIb、screenClass。其中screenClass代表全屏播放窗口。

设计思路:在timer控件中用FindWindow检查有无screenClass的窗口,用TimeSpan倒计时。

设计成一个托盘程序,用一个notifyIcon和contextMenuStrip关联。

代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.IO; namespace pptClock
{  //使用说明:用于PPT倒计时的winform。将播放的PPT文件名最后加上数字,表示播放限时的分钟数。若数字为0或无数字表示不限时。
public partial class Form1 : Form
{
//相关的win32 api
[DllImport("user32.dll")]
private static extern int GetWindowTextW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);
[DllImport("user32.dll")]
private static extern int GetClassNameW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);
[DllImport("user32.dll", EntryPoint = "FindWindow")]
private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
public const int WM_CLOSE = 0x10;
[DllImport("user32.dll", EntryPoint = "SendMessageA")]
public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); //全屏播放PPT窗口信息
public struct WindowInfo
{
public IntPtr hWnd; //ppt窗口句柄
public string szWindowName;//窗口标题
public string szClassName;//类名:screenClass ,实际没有用。
public int timeL; //播放限时,从文件名中获取
} public bool hasscreenClass()  //是否有全屏播放PPT
{
bool yn = false;
IntPtr hwnd = FindWindow("screenClass", null);
if (hwnd != IntPtr.Zero)//有全屏的PPT
{
yn = true;
//则将窗口信息保存到wndfullscreen中
StringBuilder sb = new StringBuilder();
//get hwnd
wndfullscreen.hWnd = hwnd;
//get window name
GetWindowTextW(hwnd, sb, sb.Capacity);
wndfullscreen.szWindowName = sb.ToString();
//get window class
GetClassNameW(hwnd, sb, sb.Capacity);
wndfullscreen.szClassName = sb.ToString();
Match result = Regex.Match(wndfullscreen.szWindowName.ToLower(), @"\d{1,2}(?=.ppt)", RegexOptions.RightToLeft);
string r = result.Value;
int timeL;
if (r != "")
{
timeL = int.Parse(r);
}else
{
timeL = ;
}
wndfullscreen.timeL = timeL; }
return yn;
} WindowInfo wndfullscreen = new WindowInfo();//用于保存正在全屏播放的窗口信息
TimeSpan ts = new TimeSpan(); //保存播放倒计时
bool playflag = false; //播放flag;
bool rtimeflag = false; //是否对播放的ppt限时的flag; public Form1()
{
InitializeComponent();
} private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
} private void Form1_Load(object sender, EventArgs e)
{
//this.Hide = true;
this.ShowInTaskbar = false;
timer1.Interval = ;
this.Top = ;
Rectangle ScreenArea = System.Windows.Forms.Screen.GetBounds(this);
int width1 = ScreenArea.Width; //屏幕宽度
int width2 = this.Width;
this.Left = width1 - width2-;//定位到屏幕右上角
timer1.Enabled = true; //开始计时
this.TopMost = true;//显示在最前 } private void timer1_Tick(object sender, EventArgs e)
{
if (playflag == false && hasscreenClass())//说明是刚开始播放
{
playflag = true;
int timeL = wndfullscreen.timeL;
if(timeL > )
{
rtimeflag = true; //表明要对本ppt进行倒计时
ts = new TimeSpan(, wndfullscreen.timeL,); //设定倒计时时间
}
}
if (playflag == true && rtimeflag == true) //正在播放且需要进行限时
{
ts = ts.Subtract(new TimeSpan(, , ));//倒计时,每隔一秒减去一秒
String str = ts.Minutes.ToString() + ":" + ts.Seconds.ToString();
this.label1.Text = str;
}else //不限时,则显示时钟
{
String str = DateTime.Now.Hour.ToString() + ":"+ DateTime.Now.Minute.ToString() + ":" + DateTime.Now.Second.ToString();
this.label1.Text = str; }
//用户提前退出ppt
if (playflag == true && !hasscreenClass())
{
playflag = false;
rtimeflag = false; }
//倒计时结束
if (ts.TotalSeconds < 0.0 && hasscreenClass())//当倒计时完毕
{
IntPtr hwnd_win = wndfullscreen.hWnd;
SendMessage(hwnd_win, WM_CLOSE, , );//发送退出消息
playflag = false;
rtimeflag = false; } } private void 设置ToolStripMenuItem_Click(object sender, EventArgs e)
{
//选择播放目录
string fullfname, extension;
string path = string.Empty;
System.Windows.Forms.FolderBrowserDialog fbd = new System.Windows.Forms.FolderBrowserDialog();
if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
path = fbd.SelectedPath;
} if (path != string.Empty)
{
DirectoryInfo di = new DirectoryInfo(path);
foreach (var fi in di.GetFiles())
{
extension =fi.Extension.ToLower();
if(extension == ".ppt" || extension == ".pptx")
{
try
{
fullfname = fi.FullName;
//修改文件名加上“限时”
if (fullfname.Contains("安全环保部"))
{
fi.MoveTo(fullfname + "_限时8" + extension);
}
else
{
fi.MoveTo(fullfname + "_限时5" + extension);
}
//打开目录
System.Diagnostics.Process.Start(fi.DirectoryName);
}
catch { } } } } } }
}

补充:增加了可拖动窗口的代码如下:

//处理拖动
protected override void WndProc(ref Message m)
{
if(m.Msg == 0x0201){//鼠标左键按下
m.Msg = 0x00A1; //更改消息为非客户区按下鼠标
m.LParam = IntPtr.Zero; //默认值
m.WParam = new IntPtr(); //鼠标放在标题栏内 }
base.WndProc(ref m);
}

实现ppt幻灯片播放倒计时的更多相关文章

  1. 一款炫酷的幻灯片播放框架介绍(附demo及使用方法)

    废话不多说,先上demo(建议在chrome下打开 F键全屏 esc退出全屏): 我的demo-博客园简介 官网demo 更多demo 今天为大家介绍一款基于css3和JavaScript的幻灯片播放 ...

  2. 放映PPT幻灯片演示文稿如何让演讲者备注不投影到屏幕上(转载)

    ps  files/ps.rar 放映PPT幻灯片演示文稿如何让演讲者备注不投影到屏幕上 如题,在PPT幻灯片的演示文稿中加入演讲者备注(使用PPT讲座时苦于有时会忘记一些要讲的数字,文字等),但是在 ...

  3. Camera 幻灯片播放

    Camera 幻灯片播放与轮播有些类似,不同的是在camera 幻灯片播放时有很多很炫很酷的播放效果 : 简单的介绍Camera 插件的使用方式: 1.引入js: <script src=&qu ...

  4. js实现幻灯片播放图片示例代码

    幻灯片播放图片的效果想必大家都有见到过吧,下面有个不错的示例,感兴趣的朋友可以参考下 复制代码代码如下: <select id="img_date" style=" ...

  5. Java设置PPT幻灯片背景——纯色、渐变、图片背景

    PPT幻灯片生成时,系统默认是无色背景填充,幻灯片设计需要手动设置背景效果,可设置颜色填充或者图片背景填充.本文将对此介绍具体实现方法. 使用工具:Free Spire.Presentation fo ...

  6. C# 合并、拆分PPT幻灯片

    概述 通过合并.拆分的功能,将不同的文档中的幻灯片进行组合形成新的的文档,同时也可以将一个多页的PPT文档按页拆分成多个不同的文档.此功能也丰富了编程人员对PPT幻灯片的操作的选择.下面将分别从以下几 ...

  7. 非常优秀的swiper插件————幻灯片播放、图片轮播

    http://www.idangero.us/ http://www.swiper.com.cn/ Swiper中文网 2015-10-15 SuperSlide2: (这是个PC用的滚屏插件,看着不 ...

  8. css实现幻灯片播放效果

    用css实现幻灯片播放是最基础的,闲下来没事就试着写了一下,如果有不够完善或者方法不好的地方还请指点.下面我就用两种方法实现css花灯片效果. 方法1:定位.通过position属性改变left值 h ...

  9. PPT幻灯片放映不显示备注,只让备注显示在自己屏幕上-投影机 设置

    无论是老师或是讲师还是即将要演讲的人,在讲课之前一定会做好课件,到哪一页该讲哪些内容,到哪里该如何去讲等等.那么一般的讲师会将这些课件存放到哪里呢?是用个书本记载下来呢,还是直接存放到电脑上呢?其实本 ...

随机推荐

  1. JavaSE-基础语法(三)-面向对象

    面向对象 8.类9.对象10.封装11.继承12.多态13.构造器14.super15.this16.接口17.抽象类18.权限修饰符19.内部类

  2. 微信小程序之封装http请求

    下面将封装http请求服务部分的服务以及引用部分 // 本服务用于封装请求 // 返回的是一个promisepromise var sendRrquest = function (url, metho ...

  3. CA 工作流程

    散列函数 Hash 常见的有 MD5, SHA1, SHA256, 该类函数特点是函数单向不可逆,对输入非常敏感,输出长度固定,针对数据的任何修改都会改变散列函数的结果,用于防止信息篡改并验证数据的完 ...

  4. thinkphp 使用paginate分页搜索带参数

    最近做项目发现使用paginate分页,搜索的时候点下一页搜索条件就变没了,所以在网上找了找一些方法,有的说是使用Page类,但是用习惯了paginate,再用Page不习惯,找到了一个方法,可以使用 ...

  5. mysql安装完成之后为root用户添加密码

    编辑MySql的配置文件:my.ini(在MySql安装目录下). 打开配置文件,在文件最后一行添加:skip-grant-tables,然后保存退出. 意思为就是在启mysql时不启动grant-t ...

  6. Django之URL路由系统

    一 URL配置 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表.你就是以这 ...

  7. maven 继承

    一个 maven 项目可以继承另一个 maven 的依赖, 称为子项目 父项目 使用场景: 多个子项目都需要某些依赖, 就可以把子项目共同的依赖抽取到父项目中, 子项目通过继承得到这些依赖, 这样也更 ...

  8. View的getMeasuredWidth和getWidth有什么区别?

    getMeasuredWidth 为view的测量宽度. getWidth为view的最终宽度. (这里只讨论宽度,高度也是一样的道理) 那么它们之间有什么区别呢? 测量宽度是在view的measur ...

  9. Android为TV端助力 android 在5.0以后不允许使用隐式Intent方式来启动Service

    android5.0以后不能使用隐式intent :需要指定Intent的ComponentName信息:intent.setComponent(xxx),或指定Intent的setPackage(& ...

  10. 【mongoDB高级篇③】综合实战(1): 分析国家地震数据

    数据准备 下载国家地震数据 http://data.earthquake.cn/data/ 通过navicat导入到数据库,方便和mysql语句做对比 shard分片集群配置 # step 1 mkd ...