最近在做一个自助查询终端,要求是:程序在固定时间没有操作以后,则需要自动播放PPT。当鼠标移动的时候,关闭PPT。由于找不到合适的控件来全屏播放PPT,于是我采用了Process对象来启动PPT,也就是程序达到最大等待时间后,通过程序启动一个PPT。
由于启动PPT以后,一般的事件则无法控制Process对象了,所以我使用了一个全局鼠标钩子,捕获鼠标的移动和点击事件一旦鼠标移动或者点击,则kill掉Process对象。但是现在有一个问题,就是启动PPT实际上需要一定的时间(2——3秒)如果在正在启动时鼠标移动或者点击,这时PPT就是非正常关闭。那么,当第二次启动的时候,PPT就会弹出对话框提示上次非正常关闭,这时整个系统就将不再是全屏显示了。这绝对是一个导致系统不稳定的因素(自助查询系统要保证系统无论任何情况下都要保持全屏,避免用户操作查询机的其它东西)。不知道有没有办法解决该问题。启动PPT代码:注意Process是全局变量
 //启动宣传资料
        private void startProMate()
        {
            string path = "propaganda_file\\";
            string[] fileNames = Directory.GetFiles(path);            FileInfo file = new FileInfo(fileNames[0]);            System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo();
            info.FileName = file.FullName;//这里必须使用绝对路径
            info.WorkingDirectory = path;            try
            {
                proMate = System.Diagnostics.Process.Start(info);
            }
            catch (System.ComponentModel.Win32Exception)
            {
                return;
            }
            proMate.Refresh();
            proMate.WaitForExit();
            
        }
全局钩子捕获到的鼠标移动或者点击执行的方法:
        //鼠标钩子捕获到鼠标移动或者按下所执行的方法
        private void hookHanld()
        {
            standCountdown = defaultStandbyTimes;//一旦鼠标移动,则待机倒计时重新设置为最大值            if (proMate == null)
            {
                return;
            }
            
            if (proMate.HasExited == false)//是否正在播放宣传资料,为true代表正在播放
            {
                proMate.Kill();
            }
        }希望各位高手能多多指点,试过很多方法,都有问题。比如在启动Process对象之前stop掉钩子,启动完毕再启动,但是发现程序到proMate.WaitForExit()这个方法就不继续执行了,stop掉的钩子无法在start,使用变量来判断是一样的情况。