Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义Powerpoint幻灯片_C#_Winapi_Powerpoint_Fadein - Fatal编程技术网

C# 自定义Powerpoint幻灯片

C# 自定义Powerpoint幻灯片,c#,winapi,powerpoint,fadein,C#,Winapi,Powerpoint,Fadein,我只在C#上工作了几个星期,就遇到了一个线程问题 我一直在构建一个自定义幻灯片,它实现了一个.ppt演示文稿,该演示文稿托管在一个由独立类处理的winform中。幻灯片将使用另一个显示车间动态数据的程序关闭。第二个程序需要发送命令才能进入全屏模式,因为我无法访问它的源代码 使用SetForeGroundIndow API,我可以很容易地在两个应用程序之间切换,并通过COM接口控制电源点,但随着屏幕大小的调整,转换会变得不稳定。我想覆盖一个空白的黑色winform,当这个转换发生时它会淡入淡出。到

我只在C#上工作了几个星期,就遇到了一个线程问题

我一直在构建一个自定义幻灯片,它实现了一个.ppt演示文稿,该演示文稿托管在一个由独立类处理的winform中。幻灯片将使用另一个显示车间动态数据的程序关闭。第二个程序需要发送命令才能进入全屏模式,因为我无法访问它的源代码

使用SetForeGroundIndow API,我可以很容易地在两个应用程序之间切换,并通过COM接口控制电源点,但随着屏幕大小的调整,转换会变得不稳定。我想覆盖一个空白的黑色winform,当这个转换发生时它会淡入淡出。到目前为止,我还没有顺利完成这项工作,我已经尝试在不同的线程上运行淡入淡出的表单和转换,但我还没有完全弄明白。如果有人对如何做到这一点有任何建议,我们将不胜感激

谢谢。

一个想法

有两个ppt加载器

当前的和正在加载的新的

保持当前文件可见并处于活动状态,直到新文件准备就绪。然后,一旦新文件准备就绪,就隐藏当前文件。这会给你一个很好的过渡

由于将有两个查看器处于活动状态,这将稍微占用更多的资源,但切换应该更加平滑


可能需要区分加载和启动。这样,您就可以在场景后面加载,加载后,显示并启动ppt

在完成一些示例代码后,我实现了一个后台工作程序,完成了这个技巧。更多信息

我试图找到一种更可靠的方法来确保应用程序处理F11命令,但现在我已经加入了一个线程。在SendKeys之前休眠

请随时留下评论或问题

[DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SetForegroundWindow(IntPtr hWnd);

    Process p;
    //Process p is initialized: p = Process.Start(@"<path\application.exe>");
    Form2 oForm;

 private void transition()
    {
        BackgroundWorker bw = new BackgroundWorker();
        oForm = new Form2();

        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
        oForm.Show();
        if (bw.IsBusy != true)
        {
            bw.RunWorkerAsync();
        }

    }
    private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {       
        oForm.closethis();
    }
    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

            if ((worker.CancellationPending == true))
            {
                e.Cancel = true;                   
            }
            else
            {                   
                SetForegroundWindow(p.MainWindowHandle);
                p.WaitForInputIdle(3000);
                System.Threading.Thread.Sleep(500);
                SendKeys.SendWait("{F11}");    
                //Sends the application into full screen mode           
            }

    }
[DllImport(“user32.dll”)]
[返回:Marshallas(UnmanagedType.Bool)]
静态外部bool setforegroundindow(IntPtr hWnd);
过程p;
//进程p已初始化:p=Process.Start(@“”);
形式2;
私有无效转换()
{
BackgroundWorker bw=新的BackgroundWorker();
oForm=新Form2();
bw.DoWork+=新DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted+=新的RunWorkerCompletedEventHandler(bw\u RunWorkerCompleted);
of form.Show();
如果(bw.IsBusy!=真)
{
RunWorkerAsync();
}
}
私有void bw_RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
{       
of form.closethis();
}
私有void bw_DoWork(对象发送方,DoWorkEventArgs e)
{
BackgroundWorker worker=发件人作为BackgroundWorker;
if((worker.CancellationPending==true))
{
e、 取消=真;
}
其他的
{                   
SetForegroundWindow(p.MainWindowHandle);
p、 等待输入(3000);
系统.线程.线程.睡眠(500);
SendKeys.SendWait(“{F11}”);
//将应用程序发送到全屏模式
}
}
以及淡入淡出的表单的代码

public partial class Form2 : Form
{
    public Form2()
    {
        this.Visible = false;
        this.Opacity = 0;

        InitializeComponent();

        this.TopMost = true; 
        this.Visible = true;

        while (this.Opacity < 1)
        {
           this.Opacity += .05;
           Thread.Sleep(5);
           this.TopMost = true;
        }       
    }
    private void closefade()
    {
        while (this.Opacity > 0)
        {
            this.Opacity -= .05;
            Thread.Sleep(5);
            this.TopMost = true;
        }
        this.Close();
    }

    delegate void CloseBack();
    public void closethis()
    {
        if (this.InvokeRequired)
        {
            CloseBack b = new CloseBack(closethis);
        }
        else
            closefade();
    }
}
公共部分类表单2:表单
{
公共表格2()
{
可见=假;
这个。不透明度=0;
初始化组件();
this.TopMost=true;
可见=真实;
while(这个不透明度<1)
{
这是不透明度+=.05;
睡眠(5);
this.TopMost=true;
}       
}
私人空间
{
while(this.Opacity>0)
{
这个不透明度-=.05;
睡眠(5);
this.TopMost=true;
}
这个。关闭();
}
委托void CloseBack();
公营机构
{
if(this.invokererequired)
{
关闭b=新关闭(关闭此);
}
其他的
closefade();
}
}

谢谢你的建议。我正在寻找一个后台工作人员来加载演示文稿,这样可以减少加载时间。但要澄清的是,我只有一个powerpoint演示文稿,我已经通过使用shell主机将其嵌入winform来处理它。另一个程序显示激活的数控机床,无法通过COM接口进行控制。在等待进程空闲后,我必须使用setforegroundindow,后跟SendKeys,以启用全屏模式。这种转换是有效的,但同时用户会看到应用程序切换、窗口移动和调整大小。