Objective c 在Cocoa中冻结OSX屏幕

Objective c 在Cocoa中冻结OSX屏幕,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我有两种方法可以修改屏幕的显示。有没有办法在调用第二个方法之前冻结屏幕 // 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中,这类似于ScreenUpdate=FALSE。可可中有类似的功能吗 一种可能的

我有两种方法可以修改屏幕的显示。有没有办法在调用第二个方法之前冻结屏幕

// 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中,这类似于ScreenUpdate=FALSE。可可中有类似的功能吗

一种可能的方法是截图:

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

但我恐怕这太慢了,占用了很多内存。有没有更有效的方法?

你在说什么屏幕

标准行为是:

  • 更新感兴趣的各种视图的属性
  • 每一个都将调用自己的
    setNeedsDisplayInRect
    。作为这些调用的结果,将在运行循环上安排重画
  • 完成所有更新后,运行循环将能够转到下一项
  • 最终,它将到达计划的重画,并对适当的视图进行适当的
    drawRect
    调用

  • 因此,您在响应操作时所做的所有视图更改都是自动原子的。要创建一个部分更新,您必须大大改变自己的方式。

    您在说什么屏幕

    标准行为是:

  • 更新感兴趣的各种视图的属性
  • 每一个都将调用自己的
    setNeedsDisplayInRect
    。作为这些调用的结果,将在运行循环上安排重画
  • 完成所有更新后,运行循环将能够转到下一项
  • 最终,它将到达计划的重画,并对适当的视图进行适当的
    drawRect
    调用

  • 因此,您在响应操作时所做的所有视图更改都是自动原子的。要创建一个部分更新,您必须大大改变自己的方式。

    使用CGWindowListCreateImage拍摄屏幕截图需要几毫秒的时间,并且几乎需要任何内存。通常直接在图形卡中完成


    在做任何性能假设之前,请先尝试一下:-)

    使用CGWindowListCreateImage拍摄屏幕截图需要几毫秒的时间,并且几乎可以使用任何内存。通常直接在图形卡中完成



    在进行任何性能假设之前,请先试用一下:-)

    我正在使用辅助功能API调整窗口的大小和位置。无法同时更改大小和位置。屏幕更新两次(首先调整窗口大小,然后重新定位)。请在您使用的辅助功能API中发布调用;这是问题的关键信息!你不能指望别人能读懂你的心思。我一直在期待一个答案,不管屏幕被冻结时会发生什么,都会冻结屏幕,或者调用可访问性API或其他什么。无论如何,调用是AXUIElementCopyAttributeValue(myAXWindowElement、kAXPositionAttribute、myTargetPosition),我正在使用可访问性API调整窗口的大小和位置。无法同时更改大小和位置。屏幕更新两次(首先调整窗口大小,然后重新定位)。请在您使用的辅助功能API中发布调用;这是问题的关键信息!你不能指望别人能读懂你的心思。我一直在期待一个答案,不管屏幕被冻结时会发生什么,都会冻结屏幕,或者调用可访问性API或其他什么。无论如何,这个调用是AXUIElementCopyAttributeValue(myAXWindowElement、kAXPositionAttribute、myTargetPosition)。您的主题令人困惑和误导。如果你说“屏幕的显示”,大多数人都会想到你说的是显示器屏幕。我的英语不是很好,很抱歉。但我的问题很容易理解,不是吗?我只想知道如何冻结屏幕上显示的内容。有一个函数
    NSDisableScreenUpdates
    ,但它只在进程拥有的windows上工作。因此,如果您使用可访问性来控制另一个进程,那么这将不起作用。您的主题令人困惑和误导。如果你说“屏幕的显示”,大多数人都会想到你说的是显示器屏幕。我的英语不是很好,很抱歉。但我的问题很容易理解,不是吗?我只想知道如何冻结屏幕上显示的内容。有一个函数
    NSDisableScreenUpdates
    ,但它只在进程拥有的windows上工作。因此,如果您使用可访问性来控制另一个进程,则该操作将不起作用。我尝试了该操作,但遇到了一个问题。因此,顺序是:(1)获取屏幕快照,(2)将屏幕快照图像覆盖在屏幕上,(3)执行第一次屏幕更新,(4)执行第二次屏幕更新,(5)删除屏幕快照图像。但是第(2)步似乎太慢了,所以当我运行代码时,顺序看起来像1-3-4-2-5。有什么方法可以防止(3)和(4)在(2)完成之前运行?经过几次尝试和错误后,我成功地使其工作。对我来说还是有点慢,但至少它能工作。@user5498580这个答案对你有帮助吗?如果是,您是否愿意使用我答案上留下的绿色复选标记来接受它?我尝试了,但遇到了一个问题。因此,顺序是:(1)获取屏幕快照,(2)将屏幕快照图像覆盖在屏幕上,(3)执行第一次屏幕更新,(4)执行第二次屏幕更新,(5)删除屏幕快照图像。但是第(2)步似乎太慢了,所以当我运行代码时,顺序看起来像1-3-4-2-5。有什么方法可以防止(3)和(4)在(2)完成之前运行?经过几次尝试和错误后,我成功地使其工作。对我来说还是有点慢,但至少它能工作。@user5498580这个答案对你有帮助吗?如果是,您愿意使用我答案上留下的绿色复选标记接受吗?