Zwar gibt es keine öffentliche API ist, dies zu tun, können Sie in IOKit
‚s IOHIDEventSystem
Haken und für Bildschirm dimmen Benachrichtigungen hören:
// Create and open an event system.
IOHIDEventSystemRef system = IOHIDEventSystemCreate(NULL);
// Set the PrimaryUsagePage and PrimaryUsage that the AppleProxShim service uses
int page = 65280;
int usage = 8;
// Create a dictionary to match the service with
CFStringRef keys[2];
CFNumberRef nums[2];
keys[0] = CFStringCreateWithCString(0, "PrimaryUsagePage", 0);
keys[1] = CFStringCreateWithCString(0, "PrimaryUsage", 0);
nums[0] = CFNumberCreate(0, kCFNumberSInt32Type, &page);
nums[1] = CFNumberCreate(0, kCFNumberSInt32Type, &usage);
CFDictionaryRef dict = CFDictionaryCreate(0, (const void**)keys, (const void**)nums, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
// Get the total of matching services with the above criteria
CFArrayRef srvs = (CFArrayRef)IOHIDEventSystemCopyMatchingServices(system, dict, 0, 0, 0, 0);
// Get the service
IOHIDServiceRef serv = (IOHIDServiceRef)CFArrayGetValueAtIndex(srvs, 0);
int interval = 1 ;
// Set an interval of 1 , to activate the sensor
IOHIDServiceSetProperty((IOHIDServiceRef)serv, CFSTR("ReportInterval"), CFNumberCreate(0, kCFNumberSInt32Type, &interval));
// add your event handler
IOHIDEventSystemOpen(system, handle_event, NULL, NULL, NULL);
int defaultInterval = 0;
IOHIDServiceSetProperty((IOHIDServiceRef)serv, CFSTR("ReportInterval"), CFNumberCreate(0, kCFNumberSInt32Type, &defaultInterval));
// close handles and release the IOHIDEventSystemRef
IOHIDEventSystemClose(system, NULL);
CFRelease(system);
Ihre Event-Handler-Funktion Zeiger wird wie folgt aussehen:
void handle_event(void* target, void* refcon, IOHIDServiceRef service, IOHIDEventRef event) {
if (IOHIDEventGetType(event) == kIOHIDEventTypeProximity) { // Proximity Event Received
// not necessary, but if you want the value from the sensor, get it from IOHIDEventGetIntegerValue
int proximityValue = IOHIDEventGetIntegerValue(event, (IOHIDEventField)kIOHIDEventFieldProximityDetectionMask); // Get the value of the ProximityChanged Field (0 or 64)
// Call dimScreen with the boolean NO
int (*SBSSpringBoardServerPort)() = (int (*)())dlsym(RTLD_DEFAULT, "SBSSpringBoardServerPort");
int port = SBSSpringBoardServerPort();
void (*_SBDimScreen)(int _port,BOOL shouldDim) = (void (*)(int _port,BOOL shouldDim))dlsym(RTLD_DEFAULT, "SBDimScreen");
// This is where the logic to dim the screen based on the sensor value would go. In this case, I'm hardcoding NO instead of the value of proximityValue from above
// BOOL dim = proximityValue == 0 ? NO : YES;
_SBDimScreen(port, NO);
}
}
Der Aufruf _SBDimScreen
ist möglicherweise nicht einmal erforderlich, da ein leerer Funktionszeiger alle Näherungssensorereignisse stoppen kann.
Code geändert von der Befehlszeile Werkzeugbeispiel auf der AppleProxShim Seite auf dem iPhoneDevWiki.
Hallo, danke für die Antwort.Ok, mit deinem Code kann ich den Zustand des Näherungssensors kennen, aber wenn der Zustand "JA" ist, ist die Anzeige immer noch nicht sichtbar? –
aktualisiert meine Antwort –