实现ppt幻灯片播放倒计时
需求:为控制会议时间,采取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幻灯片播放倒计时的更多相关文章
- 一款炫酷的幻灯片播放框架介绍(附demo及使用方法)
废话不多说,先上demo(建议在chrome下打开 F键全屏 esc退出全屏): 我的demo-博客园简介 官网demo 更多demo 今天为大家介绍一款基于css3和JavaScript的幻灯片播放 ...
- 放映PPT幻灯片演示文稿如何让演讲者备注不投影到屏幕上(转载)
ps files/ps.rar 放映PPT幻灯片演示文稿如何让演讲者备注不投影到屏幕上 如题,在PPT幻灯片的演示文稿中加入演讲者备注(使用PPT讲座时苦于有时会忘记一些要讲的数字,文字等),但是在 ...
- Camera 幻灯片播放
Camera 幻灯片播放与轮播有些类似,不同的是在camera 幻灯片播放时有很多很炫很酷的播放效果 : 简单的介绍Camera 插件的使用方式: 1.引入js: <script src=&qu ...
- js实现幻灯片播放图片示例代码
幻灯片播放图片的效果想必大家都有见到过吧,下面有个不错的示例,感兴趣的朋友可以参考下 复制代码代码如下: <select id="img_date" style=" ...
- Java设置PPT幻灯片背景——纯色、渐变、图片背景
PPT幻灯片生成时,系统默认是无色背景填充,幻灯片设计需要手动设置背景效果,可设置颜色填充或者图片背景填充.本文将对此介绍具体实现方法. 使用工具:Free Spire.Presentation fo ...
- C# 合并、拆分PPT幻灯片
概述 通过合并.拆分的功能,将不同的文档中的幻灯片进行组合形成新的的文档,同时也可以将一个多页的PPT文档按页拆分成多个不同的文档.此功能也丰富了编程人员对PPT幻灯片的操作的选择.下面将分别从以下几 ...
- 非常优秀的swiper插件————幻灯片播放、图片轮播
http://www.idangero.us/ http://www.swiper.com.cn/ Swiper中文网 2015-10-15 SuperSlide2: (这是个PC用的滚屏插件,看着不 ...
- css实现幻灯片播放效果
用css实现幻灯片播放是最基础的,闲下来没事就试着写了一下,如果有不够完善或者方法不好的地方还请指点.下面我就用两种方法实现css花灯片效果. 方法1:定位.通过position属性改变left值 h ...
- PPT幻灯片放映不显示备注,只让备注显示在自己屏幕上-投影机 设置
无论是老师或是讲师还是即将要演讲的人,在讲课之前一定会做好课件,到哪一页该讲哪些内容,到哪里该如何去讲等等.那么一般的讲师会将这些课件存放到哪里呢?是用个书本记载下来呢,还是直接存放到电脑上呢?其实本 ...
随机推荐
- codeM美团编程大赛初赛B轮D题(考验你的数学思维!)
[编程题] 模 时间限制:1秒空间限制:32768K 给定四个正整数a,b,c,k,回答是否存在一个正整数n,使得a*n在k进制表示下的各位的数值之和模b为c.输入描述:第一行一个整数T(T < ...
- 挑战常规--搭建gradle、maven私人仓库很简单
常规 百度搜索“搭建maven私有仓库”,搜索到的结果几乎都是使用nexus 不一样的简单 如果了解maven上传原理,完全没必要搞得那么复杂庞大,区区不足百行代码就可以实现一个私有仓库. maven ...
- 微信wx.request
官方 wx.request 代码,Post 没成功过,使用Get 方式成功了. wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '' ...
- HTML5为输入框添加语音输入功能
这里介绍的是大家以后要用到的html强大功能,可直接给输入框增加语音功能,下面我们先来看看实现方法. 大家可以看到在输入框右边的麦克风图标,点击麦克风就能够进行语音识别了. 其实很简单,语音识别是ht ...
- CSS3布局之box-flex的使用
语法: box-flex:<number> 其中number取值:使用浮点数指定对象所分配其父元素剩余空间的比例.设置或检索伸缩盒对象的子元素如何分配其剩余空间.(伸缩盒最老版本) htm ...
- cf1136D. Nastya Is Buying Lunch(贪心)
题意 题目链接 给出一个排列,以及\(m\)个形如\((x, y)\)的限制,表示若\(x\)在\(y\)之前则可以交换\(x, y\). 问\(n\)位置上的数最多能前进几步 \(n \leqsla ...
- TFS 2017 持续集成速记
VS2017许多激动人 心的功能,升级! TFS2017也升级,不支持SQL2012,升级!不过貌似开发版不能升级,好吧,开发版升2014企业版! 2017据说不支持XAML生成了,但后台菜单中还 ...
- MySQL 性能优化-数据库死锁监控
MySQL性能优化-数据库死锁监控 by:授客 QQ:1033553122 1)表锁定 通过检查 table_locks_waited 和 table_locks_immediate 状态变量来分析表 ...
- MyEclipse TestNG插件安装与配置
MyEclipse TestNG插件安装与配置 by:授客 QQ:1033553122 测试环境 jdk1.8.0_121 myeclipse-10.0-offline-installer-win ...
- RobotFramework RobotFramework官方demo Quick Start Guide浅析
RobotFramework官方demo Quick Start Guide浅析 by:授客 QQ:1033553122 博客:http://blog.sina.com.cn/ishouk ...