Macos 如何使用私有coregraphic方法以编程方式缩放屏幕(如何查找函数参数)

Macos 如何使用私有coregraphic方法以编程方式缩放屏幕(如何查找函数参数),macos,cocoa,core-graphics,private,Macos,Cocoa,Core Graphics,Private,正如您可能知道的,Mac OS X内置了非常好的屏幕缩放功能,可以在System Preferences=>Universal Access中启用 现在我正试图通过编程触发屏幕缩放。我可以通过发送键盘快捷键来实现这一点,但它并没有那么流畅。所以我做了一些关于系统是如何做到这一点的研究 似乎有一些私有的核心图形方法可以实现我想要的功能,但我无法找到它们的参数 以下是我发现的功能: CGSZoomPoint CGSUnzoomPoint CGSGetZoomParameters CGSSetZoo

正如您可能知道的,Mac OS X内置了非常好的屏幕缩放功能,可以在System Preferences=>Universal Access中启用

现在我正试图通过编程触发屏幕缩放。我可以通过发送键盘快捷键来实现这一点,但它并没有那么流畅。所以我做了一些关于系统是如何做到这一点的研究

似乎有一些私有的核心图形方法可以实现我想要的功能,但我无法找到它们的参数

以下是我发现的功能:

  • CGSZoomPoint
  • CGSUnzoomPoint
  • CGSGetZoomParameters
  • CGSSetZoomParameters
  • CGSIS放大
一些人已经对核心图形框架的一些私有方法进行了反向工程,并为它们创建了标题。(参见示例) 不幸的是,我似乎缺少我需要的方法。(CGSIZoomed,实际上包括在内)

CG_EXTERN CGError CGSIsZoomed(CGSConnectionID cid, bool *outIsZoomed); 
)

我还发现了一个应用程序,它似乎能够缩放屏幕,这似乎是相关的拆卸,但我不太了解组装,因此我无法阅读它-(

如果有人知道如何使用这些私人功能,你可以在我的这一周内使用:-)

最好的,
Thomas

这个问题已经很久没有答案了,但碰巧我发现如何在我自己的工作中使用
CGSGetZoomParameters
CGSSetZoomParameters
,它们都可以用来控制和检索屏幕缩放状态的信息。函数定义如下:

CG_EXTERN CGError CGSGetZoomParameters(CGSConnectionID cid, CGPoint *origin, double * zoomFactor, int8_t *smoothed);
CG_EXTERN CGError CGSSetZoomParameters(CGSConnectionID cid, CGPoint *origin, double zoomFactor, int8_t smoothed);
其中
origin
确定使用以下方法缩放屏幕的哪个部分:

要尽可能向左缩放区域,请将
origin.x
设置为:
(desktopWidth/2)/zoomFactor

要尽可能向右缩放区域,请将
origin.x
设置为:
desktopWidth-((desktopWidth/2)/zoomFactor)

要尽可能放大区域,请将
origin.y
设置为:
(desktopHeight/2)/zoomFactor

要尽可能向右缩放区域,请将
origin.y
设置为:
desktopHeight-((desktopHeight/2)/zoomFactor)

对于
desktopWidth
desktopHeight
是当前桌面边框的总宽度/高度,包括当前排列中的所有显示。因此,如果两个1080p显示器完全水平排列,则桌面的总宽度和高度为3840x1080

要缩放中间区域,请使用介于两个极值之间的
origin
值。数学计算的结果是,它们之间的整数点数与缩放屏幕在任何给定的
zoomFactor
中可以具有的位置数完全对应

这些功能级别较低,将干扰标准的macOS辅助功能缩放功能。例如,如果您的屏幕未缩放,请使用
CGSSetZoomParameters
将其放大,然后使用一种辅助功能(如按住Control键和滚动鼠标滚轮)来更改缩放,它们将像屏幕未缩放一样工作。此外,当屏幕缩放时,无论辅助功能缩放功能如何配置,都无法使用鼠标平移屏幕,因此请小心!您可能会导致屏幕放大,用户无法再次缩小


我不确定如何使用
CGSZoomPoint
CGSUnzoomPoint
——我无法让它们产生任何效果。但是如上所述,屏幕缩放的低级别控制可以通过其他两个功能来完成。

我也有一个想法,需要通过编程来缩放屏幕。应用程序的名称是什么?你能告诉我你是否找到了一些解决方案吗?因为我已经搜索了好几天了
CG_EXTERN CGError CGSGetZoomParameters(CGSConnectionID cid, CGPoint *origin, double * zoomFactor, int8_t *smoothed);
CG_EXTERN CGError CGSSetZoomParameters(CGSConnectionID cid, CGPoint *origin, double zoomFactor, int8_t smoothed);