2015-11-04 88 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这个答案对你有帮助吗?如果是的话,你想用我的答案留下的绿色复选标记来接受它吗? –