[英]Customized Powerpoint slideshow
我只在C#上工作了幾周,卻陷入了線程問題。
我一直在構建一個自定義幻燈片,該幻燈片實現在獨立類處理的winform中托管的.ppt演示文稿。 幻燈片通過另一個程序關閉,該程序顯示車間的動態數據。 需要向第二個程序發送命令以進入全屏模式,因為我無法訪問其源代碼。
使用Setforegroundwindow API,我可以輕松地在兩個應用程序之間進行切換,並通過COM接口控制電源點,但是隨着屏幕大小的改變,轉換非常不穩定。 我想覆蓋一個空白的黑色winform,它會在發生這種過渡時淡入和淡出。 到目前為止,我無法順利完成此操作,我嘗試在單獨的線程上運行漸變形式和過渡,但是我還沒有弄清楚。 如果有人對如何執行此操作有任何建議,將不勝感激。
謝謝。
一想到...
有兩個ppt加載程序。
當前的和正在加載的新的。
保持當前可見並處於活動狀態,直到准備好新的。 然后,一旦准備好新的,就隱藏當前的。 那應該給你一個很好的過渡。
由於將有兩個查看器處於活動狀態,因此將占用更多資源,但是切換應該更流暢。
可能想區分加載與啟動。 這樣,您可以在后台加載並加載后,顯示並啟動ppt。
在研究了一些示例代碼之后,我實現了一個完成該任務的后台工作者。 有關更多信息,請參見msdn-如何:使用后台工作程序 。
我試圖找到一種更可靠的方法來確保F11命令由應用程序處理,但是現在我已經在Thread.Sleep之前放入了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
}
}
以及淡入和淡出表格的代碼。
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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.