objective-c - 使用 Core Graphics 强制窗口重绘自身?

标签 objective-c macos cocoa core-graphics quartz-graphics

我开发了注入(inject)系统并连接了一些 quartz API,以便在 Mac OS X 上的 Windows 上创建一些不错的效果。例如,当用户在窗口中将颜色设置为红色时......它是红色光泽的红色。

但是,当我在已经运行的应用程序中注入(inject)时,我不能给它想要的效果,因为窗口已经被绘制了。所以,我正在寻找 quartz /核心图形中的一些东西,它可以让我重绘整个窗口,或者一些技术可以让我发送一些事件/调用一些函数,这将使系统再次重绘整个窗口。

我的意思是窗口上的所有内容都将再次绘制,以便我的 Hook API 将执行以创建适当的效果、阴影和颜色。这里创建和绘制窗口的顺序很重要。

我正在使用类似于 inject&interpose 的技术注入(inject)代码为C/C++代码。

有谁知道我该如何实现这一点?

最佳答案

-[NSView setNeedsDisplayInRect:]-[NSView setNeedsDisplay:]invalidateRect 的直接等价物。

我不知道你在 Quartz/CoreGraphics 中需要它是什么意思。 Cocoa 已经在使用它们进行绘图。

如果你想调用一些神奇的 CGxxx() 函数来重新绘制窗口,这是不可能的。窗口的标题和框架是由系统绘制的,但是至于内容,底层API 无法知道应该在那里绘制什么。唯一知道如何绘制 View 的是 View 本身。 (也许在窗口的后备存储中缓存了一些东西,但我不知道有任何公共(public)或未记录的 API 可以访问它)。

无论您找到什么,都必须基于请求 NSWindow 对象重绘其 View 。如果您已经注入(inject)到流程中,则可能涉及以下步骤:

  • 定位 obj-c 运行时(您至少需要 objc_msgSend 函数)
  • 定位 NSApplication 类
  • 使用+[NSApplication sharedApplication]-[NSApplication windows]找到NSWindow*对象指针
  • 使用contentViewdisplay等重绘

关于objective-c - 使用 Core Graphics 强制窗口重绘自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7648047/

相关文章:

iOS:如何在自定义单元格上正确使用 prepareForReuse?将编辑切换到非编辑模式时,我的单元格被错误地重复使用

ios - 我们如何禁用 future 日期并在 swift 中在日期标签下方传递副标题以及如何使用桥头

objective-c - NSBrowser setRowHeight,具有矩阵委托(delegate)的浏览器不支持

objective-c - 事件范围

objective-c - 订购彩色面板

Python npm 的替代方案 set strict ssl false

c++ - macOS Time Profiler 分析 C++ 代码但找不到我的函数名称

c - OS X 上的弱符号别名类似于 Linux 上的弱符号别名,还是最接近的等价物?

cocoa - 光标位于非键窗口上?

xcode - 使用 monomac 进行 FTP 上传