需求:为控制会议时间,采取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. SpringBoot史前简述

    背景 大约20年前,程序员们使用“企业级Java Bean”(EJB)开发企业应用,需要配置复杂的XML. 在二十世纪初期,新兴Java技术——Spring,横空出世.使用极简XML和POJO(普通J ...

  2. 如何用ABP框架快速完成项目(10) - ABP只要加人即可马上加快项目进展- 全栈篇(1) - 发挥DDD理论优势的时候到了!

    正如我在<程序员英语二三事(2) - 从听开始>里说的, 任何技术/工具/语言都有其适用场景和上下文环境. DDD理论同样是如此.   现在, 终于到了发挥DDD理论优势的时候啦!   一 ...

  3. 用ABP只要加人即可马上加快项目进展(二) - 分工篇

    2018年和1998年其中两大区别就是: 前端蓬勃发展, 前后端分离是一个十分大的趋势. 专门的测试人员角色被取消, 多出了一个很重要的角色, 产品经理   ABP只要加入即可马上加快项目进展, 选择 ...

  4. ReactNative编写规范

    <一>  React 代码规范 文件与组件命名 扩展名: 使用.js作为js文件的扩展名.如果同一个文件夹下有同名而不同作用的js文件,则通过中缀(小写)进一步区分,例如:HomePage ...

  5. SpringBoot集成Swagger接口管理工具

    手写Api文档的几个痛点: 文档需要更新的时候,需要再次发送一份给前端,也就是文档更新交流不及时. 接口返回结果不明确 不能直接在线测试接口,通常需要使用工具,比如postman 接口文档太多,不好管 ...

  6. git 入门教程之实战 git

    实战 git git 是一款分布式版本控制系统,可以简单概括: 不要把鸡蛋放在一个篮子里,你的一举一动都在监视中. 实战场景 你作为某项目的其中一员或者负责人,和小伙伴们一起开发,大家既有着各自分工互 ...

  7. (办公)rom包

    所谓ROM包,通俗点来讲,也就是手机上的系统安装包.使用过智能手机的朋友可能都有过这样的遗憾,自己所用的官方系统虽然能够满足绝大部分的需求,但总有一些细节不是很合自己的心愿……比如说,内置的输入法不好 ...

  8. Linux 中提高的 SSH 的安全性

    SSH 是远程登录 Linux 服务器的最常见的方式.且 SSH 登录的时候要验证的,相对来讲会比较安全.那只是相对,下面会介绍一些方式提高 SSH 的安全性 SSH 的验证 而SSH 登录时有两种验 ...

  9. 利用dockerfile制作基于centos7的lnmp镜像(亲测,详细版)

    首先呢,这篇文章,也是小弟参考了许多文章,自己整理出来的,有很多不足之处还有待加强,期待各位评论. > LNMP 是代表 Linux 系统下的 Nginx.Mariadb.PHP 相结合而构建成 ...

  10. c/c++线性循环队列

    线性循环队列 队列是先进先出,和栈相反. 线性循环队列,牺牲一个空间,实现循环.比如空间大小为4,牺牲一个空间,所以最多放3个元素. 假设front指向0位置,tail指向3位置 1 2 3 空 出队 ...