我开发了注入(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*
对象指针 - 使用
contentView
、display
等重绘
关于objective-c - 使用 Core Graphics 强制窗口重绘自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7648047/