我目前正在编写一段代码,它使用事件点击。这是它的工作,但我有一些问题,一些选项没有很好的记录,或我不确定是否理解100%好。当被解释的时候,事件的点击过程通常被认为是“只需要这样做”,但是没有进一步的解释,我注意到了一些不同的可能性,而苹果开发人员的文档并没有给我很大的启发(所以每次信息太少或者太多).因此:
CFMachPortRef machPortRef = CGEventTapCreate(kCGSessionEventTap, kCGTailAppendEventTap, kCGEventTapOptionDefault, kCGEventMaskForAllEvents, eventTapCallback, NULL);第一行,没有问题,一切都很清楚。
//// -----> kCFAllocatorDefault or NULL ???
CFRunLoopSourceRef runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, machPortRef, 0); 1)在这里,我总是看到您应该使用kCFAllocatorDefault,但是所有的文档状态都是"The allocator to use to allocate memory for the new object. Pass NULL or kCFAllocatorDefault to use the current default allocator.",所以不熟悉这些分配器或其他鳄鱼,我们为什么要通过NULL?我想NULL不是一个非常有效的分配器..。(这是个额外的问题,只是好奇)。
//// -----> CFRunLoopGetMain() or CFRunLoopGetCurrent() ???
CFRunLoopRef runLoop = CFRunLoopGetMain();
//CFRunLoopRef runLoop = CFRunLoopGetCurrent(); 2)用CFRunLoopGetMain()获得主回路与用CFRunLoopGetCurrent()获得电流环有什么区别?在这种情况下哪一种最好使用?
//// -----> kCFRunLoopCommonModes or kCFRunLoopDefaultMode
CFRunLoopAddSource(runLoop, runLoopSource, kCFRunLoopCommonModes);
//CFRunLoopAddSource(runLoop, runLoopSource, kCFRunLoopDefaultMode);( 3) kCFRunLoopCommonModes和kCFRunLoopDefaultMode有什么区别?据我所知,kCFRunLoopCommonModes包括kCFRunLoopDefaultMode。那么你什么时候使用其中一种?
CGEventTapEnable(machPortRef, true);别忘了激活你的踢踏舞。
提前谢谢。我认为这些应该得到一些明确和简洁的解释,这将是一个伟大的帮助和节省时间,人们进入事件的水龙头。
发布于 2014-11-26 05:26:48
1)这不重要。通过传递kCFAllocatorDefault,您显式地选择了默认分配器,通过传递NULL,您隐式地选择了默认分配器。当然,系统不会使用NULL,而是默认的分配器。
就我个人而言,如果我关心默认情况(“是的,我需要默认的分配器”),那么我会使用NULL (“不关心,系统会做的对”)。
( 2)每个线程都有一个运行循环。使用CFRunLoopGetMain()可以获得主线程的run循环,使用CFRunLoopGetCurrent()可以获得线程的run循环,您的代码当前正在运行。这是相同的,如果您的代码运行在主线程中,否则就会有不同的运行循环。
主线程上的主运行循环将在主线程自动运行时自动启动。
您可以向进程中添加额外的线程(有它们自己的运行循环)。通常,您不希望使用线程的run循环,因为在附加(背景)线程中需要更长的计算时间。但是有时您需要在这个后台线程中运行循环,如果通过run循环(即联网)来处理的话。
3)在默认模式下,在主运行循环中添加一个计时器,它每秒钟写出一些内容,然后用鼠标输入菜单。您将看到不同的…
添加到默认模式的源只有在运行循环处于默认模式时才被分派,这意味着--长话短说--当应用程序处于非模态状态时。例如,在默认模式下不执行拖放时的菜单或“本地运行循环调度”。
简单地把模式看作是一组资源。如果运行循环在运行模式中运行,则仅分配模式中的每个源。因此,它是一种来源的选择。
在公共运行循环模式中的源是特殊的,因为它们总是独立于模式分派。
https://stackoverflow.com/questions/27141645
复制相似问题