Macos 如何以编程方式访问Mac OS X 10.5+;上的环境光照传感器;?

Macos 如何以编程方式访问Mac OS X 10.5+;上的环境光照传感器;?,macos,screen,sensors,Macos,Screen,Sensors,我试图通过编程方式访问运行在OSX10.5及更高版本上的Mac应用程序中的环境光传感器,但找不到实现这一点的方法 关于这一点,这里还提出了另外两个问题,但他们要么没有解决这个问题,要么提出了在10.5及以上版本中崩溃的解决方案 苹果使用什么私有API访问OS X上的环境光传感器数据和/或我将如何找到它?我找到了最接近的东西——Firefox bug报告中的示例代码,上次修改是在2013年4月。下面的工作原理是,生成一个简单的CLI程序来查询传感器(从中自由获取)。轮询的服务是“AppleLMUC

我试图通过编程方式访问运行在OSX10.5及更高版本上的Mac应用程序中的环境光传感器,但找不到实现这一点的方法

关于这一点,这里还提出了另外两个问题,但他们要么没有解决这个问题,要么提出了在10.5及以上版本中崩溃的解决方案


苹果使用什么私有API访问OS X上的环境光传感器数据和/或我将如何找到它?

我找到了最接近的东西——Firefox bug报告中的示例代码,上次修改是在2013年4月。下面的工作原理是,生成一个简单的CLI程序来查询传感器(从中自由获取)。轮询的服务是
“AppleLMUController”
,然后您可以从中提取相关信息——下面的代码片段创建一个
serviceObject=IOServiceGetMatchingService(kiomaterportDefault,IOServiceMatching(“AppleLMUController”)
,然后使用它

// lmutracker.mm
//
// clang -o lmutracker lmutracker.mm -framework IOKit -framework CoreFoundation

#include <mach/mach.h>
#import <IOKit/IOKitLib.h>
#import <CoreFoundation/CoreFoundation.h>

static double updateInterval = 0.1;
static io_connect_t dataPort = 0;

void updateTimerCallBack(CFRunLoopTimerRef timer, void *info) {
  kern_return_t kr;
  uint32_t outputs = 2;
  uint64_t values[outputs];

  kr = IOConnectCallMethod(dataPort, 0, nil, 0, nil, 0, values, &outputs, nil, 0);
  if (kr == KERN_SUCCESS) {
    printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b%8lld %8lld", values[0], values[1]);
    return;
  }

  if (kr == kIOReturnBusy) {
    return;
  }

  mach_error("I/O Kit error:", kr);
  exit(kr);
}

int main(void) {
  kern_return_t kr;
  io_service_t serviceObject;
  CFRunLoopTimerRef updateTimer;

  serviceObject = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleLMUController"));
  if (!serviceObject) {
    fprintf(stderr, "failed to find ambient light sensors\n");
    exit(1);
  }

  kr = IOServiceOpen(serviceObject, mach_task_self(), 0, &dataPort);
  IOObjectRelease(serviceObject);
  if (kr != KERN_SUCCESS) {
    mach_error("IOServiceOpen:", kr);
    exit(kr);
  }

  setbuf(stdout, NULL);
  printf("%8ld %8ld", 0L, 0L);

  updateTimer = CFRunLoopTimerCreate(kCFAllocatorDefault,
                  CFAbsoluteTimeGetCurrent() + updateInterval, updateInterval,
                  0, 0, updateTimerCallBack, NULL);
  CFRunLoopAddTimer(CFRunLoopGetCurrent(), updateTimer, kCFRunLoopDefaultMode);
  CFRunLoopRun();

  exit(0);
}
//lmutracker.mm
//
//clang-o lmutracker lmutracker.mm-框架IOKit-框架CoreFoundation
#包括
#进口
#进口
静态双更新区间=0.1;
静态io连接数据端口=0;
void updateTimeCallback(CFRunLoopTimerRef计时器,void*信息){
kern_return_t kr;
uint32_t输出=2;
uint64_t值[输出];
kr=IOConnectCallMethod(数据端口,0,nil,0,nil,0,值和输出,nil,0);
if(kr==KERN_SUCCESS){
printf(“\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b%8lld%8lld”,值[0],值[1]);
返回;
}
if(kr==kIOReturnBusy){
返回;
}
马赫数错误(“I/O套件错误:”,kr);
出口(kr);
}
内部主(空){
kern_return_t kr;
io_服务\u t服务对象;
CFRunLoopTimerRef updateTimer;
serviceObject=IOServiceGetMatchingService(kIOMasterPortDefault,IOServiceMatching(“AppleMucontroller”);
如果(!serviceObject){
fprintf(stderr,“找不到环境光传感器\n”);
出口(1);
}
kr=IOServiceOpen(serviceObject、mach_task_self()、0和数据端口);
IOObjectRelease(serviceObject);
if(kr!=KERN_SUCCESS){
马赫误差(“IOServiceOpen:”,kr);
出口(kr);
}
setbuf(标准输出,空);
printf(“%8ld%8ld”,0L,0L);
updateTimer=CFRunLoopTimerCreate(kCFAllocatorDefault,
CFAbsoluteTimeGetCurrent()+updateInterval,updateInterval,
0,0,updateTimeCarlBack,NULL);
CFRunLoopAddTimer(CFRunLoopGetCurrent(),updateTimer,kCFRunLoopDefaultMode);
CFRunLoopRun();
出口(0);
}

我想我能够集中你在这里提出的问题,这确实是一个很好的编程问题,所以我重新打开了这个。你可以检查一下,以确保我在你的问题中正确地理解了你的意思。听起来很棒,布拉德,谢谢你澄清了这一切:)我还没来得及深入研究代码,但看起来你已经搞定了。它也适用于埃尔卡皮坦。。。未发现的
512730 512730
,已覆盖:
30 30
macOS Mojave 10.14.3——像符咒一样编译,但未找到任何环境光传感器:
未能找到环境光传感器
。然而,我只是试图读取数据,以检查我的传感器是否损坏或是某些软件相关错误导致了问题。所以也许其他人应该再检查一遍。@gr4nt3d唉,这意味着你在触摸屏mac上运行了它——苹果又在它的花园里筑了更多的墙,我们还没有打破它们。@Landak:是的,的确如此!我遇到过这样一个问题,我的屏幕背光不再是自动调节的,我试图找出这是否是硬件问题。此外,不可控的触摸栏(和键盘背光)亮度现在一直保持在100%。还没有进展。