实现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幻灯片放映不显示备注,只让备注显示在自己屏幕上-投影机 设置
无论是老师或是讲师还是即将要演讲的人,在讲课之前一定会做好课件,到哪一页该讲哪些内容,到哪里该如何去讲等等.那么一般的讲师会将这些课件存放到哪里呢?是用个书本记载下来呢,还是直接存放到电脑上呢?其实本 ...
随机推荐
- struts2_struts2基本配置
基本配置 1.新建web项目 2.导入jar包 struts2所需jar包下载: https://files.cnblogs.com/files/aihuadung/struts%E6%89%80%E ...
- POST与GET的联系与区别
是什么? GET与POST是在客户机和服务器之间进行请求-响应时,两种最常被用到的方法: GET-从指定的资源请求数据. POST-向指定的资源提交要被处理的数据. 所以我们从语义上就能看出两者最明显 ...
- MyBatis:Pagehelper分页
对于分页插件这里选择查询所有用户的信息,以列表返回 前端只需输入分页数的数据既可 service实现类也很方便,甚至我都开始有点喜欢上这种Example的SQL形式了. 最后页面调用url的json信 ...
- mybatis插件机制
目录 mybatis插件机制 主要 类/接口 和 方法 mybatis插件机制实现 mybatis插件机制 mybatis的插件机制使用动态代理实现,不了解的朋友请先了解代理模式和动态代理:插件本质是 ...
- phpstorm连接服务器,实时编辑上传文件到服务器
教程一:我的老版本,并且是汉化的,找到该位置 打开后:点击Configuration进行配置! 输入服务器的ip.端口.用户名.密码即可 打开编辑: 教程二:下面更新了一个新版本的(2018.2): ...
- 关于RecyclerView你知道的不知道的都在这了(下)
目录 目录 正文 6. Recycler 7. ItemAnimator 8. ItemDecoration 9. OnFlingListener 目录 由于本篇篇幅特长,特意做了个目录,让大伙对本篇 ...
- js-clickNumCount.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- T研究:国内云BPM市场规模尚小,预计2018年仅为3.29亿元
文章摘要:T研究发现,目前国内云BPM市场规模不高,预计今年为3.29亿元,不过其增速稳定,未来发展仍可期. BPM?什么鬼?反正作为“菊外人”的小编是第一次听说. 其实,对于这个词,不光是小编,国内 ...
- 自定义View的三个构造函数
自定义View有三个构造方法,它们的作用是不同的. public MyView(Context context) { super(context); } public MyView(Context c ...
- Python 基于Python实现的ssh兼sftp客户端(下)
基于Python实现的ssh兼sftp客户端 by:授客 QQ:1033553122 otherTools.py #!/usr/bin/env/ python # -*- coding:utf-8 ...