我能夠讓我的程序「玩得很好」。我不知道它爲什麼會起作用,原始代碼沒有,但是這不僅有效 - 它實際上使得程序更加「節能」,因爲它在屏幕暫停後不進行計算,從而減少了CPU週期。總之,我預覽了WndProc消息,並尋找顯示器正在被暫停的消息,一旦收到,我停止重畫直到它恢復(可以恢復並使屏保仍然有效)。
代碼更改:
// Field Definitions
/// <summary>
/// Constants that relate to the WndProc messages we wish to intercept and evaluate.
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", "SA1310:FieldNamesMustNotContainUnderscore", Justification = "Standard practice to use this naming style for Win32 API Constants.")]
private const int WM_SYSCOMMAND = 0x0112, SC_MONITORPOWER = 0xF170;
/// <summary>
/// Gets or sets whether we are suspended. Should coincide with whether the display is turned on or not.
/// </summary>
private bool isSuspended = false;
// New overridden method
/// <summary>
/// Intercepts WndProc messages. We are looking for the screen suspend activity. From it, we will return that we are able to suspend and we ourselves will suspend.
/// </summary>
/// <param name="m">Message to be checked.</param>
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_SYSCOMMAND)
{
// The 0x000F bits are used to indicate the specific state and must be ignored to see if this is a monitor power event.
if ((m.WParam.ToInt32() & 0xFFF0) == SC_MONITORPOWER)
{
switch (m.WParam.ToInt32() & 0x000F)
{
case -1:
// Display powering on - resume operation
#if DEBUG
System.Diagnostics.Debug.WriteLine("Display powered on.");
#endif
this.isSuspended = false;
break;
case 0:
case 1:
case 2:
// Display being powered off - suspend operation
#if DEBUG
System.Diagnostics.Debug.WriteLine("Display suspended");
#endif
this.isSuspended = true;
break;
default:
#if DEBUG
System.Diagnostics.Debug.WriteLine(string.Format("Unknown power state: {0}", (m.WParam.ToInt32() & 0x000F).ToString("0")));
#endif
// Assuming that unknown values mean to power off. This is a WAG.
this.isSuspended = true;
break;
}
}
}
base.WndProc(ref m);
}
// Change to my refreshing timer.
/// <summary>
/// Called when the refresh timer ticks. This invalidates the form, forcing it to be redrawn, which creates a framerate for us.
/// </summary>
/// <param name="sender">Who called this method.</param>
/// <param name="e">Event Arguments.</param>
private void RefreshTimer_Tick(object sender, EventArgs e)
{
if (this.isSuspended)
{
// Program is in suspended mode, so don't do anything this update.
return;
}
// Program is not suspended, so invalidate the client area so it can be painted again.
this.Invalidate();
}
此更改停止時暫停被稱爲所有重繪(並停止GDI +計算),並使其後,屏幕保護程序「行爲」與電源管理設置。
非常酷 - 如果你不介意我可能會使用它作爲模板來改變我們擁有的監控應用程序,它在運行時很難撞擊數據庫,以及毫無意義,所以當屏幕無法顯示時。 –
我不介意,它已經部分取得了自己的成功!再次感謝! – Dracorat