2015-11-04 82 views
1

我有兩種修改屏幕顯示的方法。有沒有辦法凍結屏幕,直到第二個方法被調用?凍結Cocoa中的OS X屏幕

// I want to freeze the screen here 
updateDisplay1(); // Change in display doesn't take effect until screen is unfrozen 
updateDisplay2(); 
// Unfreeze screen here 

在Excel VBA中,這將會像screenUpdating = FALSE。 Cocoa中是否有類似的功能?

一種可能的方式是採取截圖:

// Take screenshot of the screen 
// Display the screenshot image in front of the screen 
updateDisplay1(); // Change is not visible 
updateDisplay2(); 
// Remove screenshot image 

但是這恐怕是緩慢的,佔用了大量的內存。有沒有更有效的方法?

+0

您的主題令人困惑和誤導。如果您說'屏幕顯示',那麼您應該會想到您正在談論顯示器屏幕。 –

+0

我的英語不太好,對不起。但是我的問題很容易理解,不是嗎?我只想知道如何凍結屏幕上顯示的內容。 – user5498580

+1

有一個函數'NSDisableScreenUpdates',但它只適用於你的進程擁有的窗口。因此,如果您使用輔助功能來控制另一個進程,那將無法工作。 – JWWalker

回答

0

你在說什麼屏幕?

標準可可的行爲是:

  1. 你更新你有興趣在各種視圖屬性;
  2. 每個人都會打電話給自己的setNeedsDisplayInRect。作爲這些調用的結果,將在運行循環中安排重繪;
  3. 一旦你完成了所有的更新,運行循環將能夠移動到它的下一個項目;
  4. 最終它將達到它預定的重繪,並將適當的drawRect調用適當的意見。

因此,您對某個操作做出的所有視圖更改都是自動原子化的。你必須明顯地用你自己的方式來創建一個局部更新。

+0

我使用Accessibility API調整窗口大小並重新定位窗口。沒有辦法同時改變大小和位置。屏幕更新兩次(窗口先調整大小然後重新定位)。 – user5498580

+0

請在您使用的Accessibility API中發佈呼叫;這是問題的重要信息!你不能指望人們閱讀你的想法。 – bhaller

+0

我期待着一個答案,即凍結屏幕,無論屏幕凍結時會發生什麼,調用Accessibility API或其他什麼。無論如何,調用AXUIElementCopyAttributeValue(myAXWindowElement,kAXPositionAttribute,myTargetPosition) – user5498580

0

使用CGWindowListCreateImage截圖需要幾毫秒,並且使用大致任何內存。它通常直接在圖形卡中完成。

在做出任何性能假設之前試一試並測量:-)

+0

我試過了,並遇到了一個問題。所以順序是:(1)獲取屏幕截圖,(2)將屏幕截圖圖像覆蓋屏幕,(3)執行第一屏幕更新,(4)執行第二屏幕更新,(5)移除屏幕截圖圖像。但似乎步驟(2)太慢,所以當我運行代碼時,順序看起來像1-3-4-2-5。 (2)完成之前有沒有辦法阻止(3)和(4)運行? – user5498580

+0

經過幾次嘗試和錯誤之後,我設法使其工作。對我的目的來說還是有點慢,但至少它是有效的。 – user5498580

+0

@ user5498580這個答案對你有幫助嗎?如果是的話,你想用我的答案留下的綠色複選標記來接受它嗎? –