我只与C#合作了几个星期而且我遇到了一个线程问题。
我一直在构建一个自定义幻灯片,它实现了一个由独立类处理的winform中托管的.ppt演示文稿。幻灯片显示与另一个显示车间动态数据的程序关闭。第二个程序需要发送一个命令进入全屏模式,因为我无法访问它的源代码。
使用Setforegroundwindow API我可以轻松地在两个应用程序之间切换,并通过COM接口控制电源点,但过渡是不稳定的,屏幕调整大小。我希望覆盖一个空白的黑色winform,在这种转换发生时淡入淡出。到目前为止,我没有成功地顺利完成这项工作,我尝试运行淡入淡出的表单并在单独的线程上进行转换,但我还没有弄明白。如果有人对如何做到这一点有任何建议,我将不胜感激。
谢谢。
答案 0 :(得分:0)
一想法......
有两个ppt装载机。
您正在加载的当前一个和新一个。
保持当前可见且有效,直到新的准备就绪。然后,一旦新的准备好,请隐藏当前的一个。这应该会给你一个很好的过渡。
由于将有两个观看者处于活动状态,因此资源密集程度会更高,但切换应该更加顺畅。
可能希望区分加载与开始。这样你就可以加载到scenese后面,一旦加载,显示并启动ppt。
答案 1 :(得分:0)
在完成一些示例代码之后,我实现了一个后台工作程序。有关详细信息From msdn - How to: Use a Background Worker。
我正在尝试找到一种更可靠的方法来确保应用程序处理F11命令,但是现在我在SendKeys之前放入了Thread.Sleep。
请随时留下评论或问题。
[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
}
}
表格淡入淡出的代码..
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();
}
}