プログラムのトリガーは、「ディスプレイを検出します。」
-
21-09-2019 - |
質問
私は、あなたが「表示」システム環境設定ペインの「検出を表示」をクリックしたときにシステムと同じことをトリガーしようとしています。このプログラムでを行う方法はありますか?私の目標は、場合には、それを持つユーザー台無しにディスプレイの解像度をリセットするには、ログイン時にこれを行いそのLaunchAgentを作成することです。
解決
あなたはアクティブでないものも含め、すべてのディスプレイのリストを取得するには、民間CoreGraphicsルーチンを使用する必要があり、その後、バスの再スキャンを要求します。このようにそれを試してみてください。
#include <IOKit/IOKitLib.h>
#include <IOKit/IOTypes.h>
CGDisplayErr CGSGetDisplayList(CGDisplayCount maxDisplays,
CGDirectDisplayID * onlineDspys,
CGDisplayCount * dspyCnt);
static void DetectDisplays()
{
CGDirectDisplayID displays[8];
CGDisplayCount dspCount = 0;
if (CGSGetDisplayList(8, displays, &dspCount) == noErr)
{
for(int i = 0; i < dspCount; i++)
{
io_service_t service = CGDisplayIOServicePort(displays[i]);
if (service)
IOServiceRequestProbe(service, kIOFBUserRequestProbe);
}
}
}
そしてApplicationServicesとIOKitのへのリンクます。
他のヒント
CGDisplayIOServicePort
コールはOS X 10.9マーベリックスでは廃止されているのでは、それはそうのような適切なマッチング・コールを介してIOFramebufferサービスを取得する方がよい場合があります。
void triggerDetectDisplays()
{
// loop over all IOFramebuffer services
CFMutableDictionaryRef matchingDict = IOServiceMatching("IOFramebuffer");
mach_port_t masterPort;
IOMasterPort(MACH_PORT_NULL, &masterPort);
io_iterator_t serviceIterator;
IOServiceGetMatchingServices(masterPort, matchingDict, &serviceIterator);
io_service_t obj = IOIteratorNext(serviceIterator);
while (obj)
{
kern_return_t kr = IOServiceRequestProbe(obj, 0);
obj = IOIteratorNext(serviceIterator);
}
}
所属していません StackOverflow