2011-11-04 69 views
1

我的程序中有這個奇怪的錯誤,我正在嘗試修復,但我真的在爲它失去什麼。我的程序的這一部分有一個對話框,顯示使用MFC/GDI的各種項目的預覽。當我滾動瀏覽不同的項目時,有時預覽圖像會消失並變爲空白。然而,它:記錄屏幕時不會出現奇怪的MFC/GDI行爲(空白圖像)

  • 只是發生在某些機器
  • 顯然發生在Windows 7和XP
  • 不會對同一項目的每
  • 項仍是存在的時候,一個需要發生屏幕截圖,但通常查看時是空白的。
  • 似乎在整個代碼中隨機的地方發生,當我試圖用斷點追蹤它。它並不總是在屏幕從圖像到空白的相同位置,這導致我相信它不會發生在與我的主線程相同的線程中,儘管這是真正的唯一線程,並未在此時被阻止。這意味着它發生在Windows線程或其他東西,不是嗎?

我假設它是某種形式的競爭條件,但特別是在屏幕截圖中預覽的行爲讓我感到困惑。爲什麼在拍攝屏幕截圖時會很好,但在屏幕上查看時爲空?是否有一些繞過屏幕上顯示或更新的「打印屏幕」的機制?

我意識到,我已經沒有太多的信息和人們顯然也沒有太大的幫助,但如果有人能想到的任何東西,這將是非常讚賞:)

謝謝!

+0

任何人有任何指針?謝謝 – Jordan

+0

我也發現如果我在窗口的OnPaint()函數中放置一個斷點,它總是斷開並且只是空白。這聽起來像是一種競爭狀態嗎? – Jordan

回答

1

另一種理論:GDI資源泄漏

如果你忘記釋放你的GDI對象,奇怪的事情開始發生 - 包括未上漆的表面。

  1. 運行taskmgr.exe並添加「GDI對象」列。
  2. 運行您的軟件並監視GDI對象計數。它穩定了嗎?
  3. 如果您的GDI對象數量不穩定,請查看您的相關WM_PAINT處理程序。

這裏有一個GDI泄漏的例子:

void CMyWnd::OnPaint() 
{ 
    CPaintDC dc(this); 
    dc.SelectObject(&font); 
} 

選擇GDI對象必須始終被取消:

void CMyWnd::OnPaint() 
{ 
    CPaintDC dc(this); 
    CFont *pOldFont = dc.SelectObject(&font); 
    // Use font 
    dc.SelectObject(pOldFont); 
} 
1

當你錄製你的屏幕時,你是否在使用GDI API來閱讀桌面?在這種情況下,任何硬件加速的表面可能會變黑(或可能是白色)。爲了測試這個,你可以禁用圖形卡的硬件加速。如果你的錄音機開始工作,那麼你已經找到了罪魁禍首!

要記錄這些非GDI表面,您可能需要使用DirectX/OpenGL讀取表面。我將開始與這篇文章:http://www.codeproject.com/KB/dialog/screencap.aspx

+0

我的程序不記錄屏幕。我只是使用打印屏幕或屏幕錄像機來嘗試記錄問題。這個問題發生在我的程序中,它使用GDI/mfc在屏幕上繪製一個繪圖/圖像。在大多數機器上沒有任何問題,屏幕上顯示圖像,但是我偶爾可以在幾臺隨機機器上重現它。使用PrintScreen時不會發生此問題。 – Jordan