我正在开发一个类似于GeekTool的应用程序。我不太熟悉GeekTool在内部是如何工作的,但它的外观和行为类似。基本上,我有一个没有边框的窗口,覆盖整个屏幕,这很好。我目前在'kCGDesktopIconWindowLevel‘层上有一个窗口,但是我不能与桌面上的任何东西交互(移动/打开文件等)。当我在这个级别(kCGDesktopIconWindowLevel-1)下面有一个层的窗口时,我可以与桌面交互,但不能与我的窗口交互,我需要能够交互。我是否可以从上面的一层接收点击,或者将它们发送到较低的层?
顺便说一句,如果你对如何做到这一点有一个更好的想法,但避免这个问题,我会非常感激的。
发布于 2012-11-30 20:36:04
我建议您在this answer中创建一个像这样的事件点击(从applicationDidFinishLaunching:中删除)
CGEventMask emask;
CFMachPortRef myEventTap;
CFRunLoopSourceRef eventTapRLSrc;
// We only want one kind of event at the moment: Left mouse down
emask = CGEventMaskBit(kCGEventLeftMouseDown);
// Create the Tap
myEventTap = CGEventTapCreate (
kCGSessionEventTap, // Catch all events for current user session
kCGTailAppendEventTap, // Append to end of EventTap list
kCGEventTapOptionListenOnly, // We only listen, we don't modify
emask,
&myEventTapCallback,
NULL // We need no extra data in the callback
);
// Create a RunLoop Source for it
eventTapRLSrc = CFMachPortCreateRunLoopSource(
kCFAllocatorDefault,
myEventTap,
0
);
// Add the source to the current RunLoop
CFRunLoopAddSource(
CFRunLoopGetCurrent(),
eventTapRLSrc,
kCFRunLoopDefaultMode
);将窗口设置为通常忽略鼠标事件-- [myWindow setIgnoresMouseEvents: YES];
然后你的活动点击将寻找它想要“捕捉”的鼠标点击--就像这样:
static CGEventRef myEventTapCallback (
CGEventTapProxy proxy,
CGEventType type,
CGEventRef event,
void * refcon
) {
CGPoint mouseLocation;
// If we would get different kind of events, we can distinguish them
// by the variable "type", but we know we only get mouse moved events
mouseLocation = CGEventGetLocation(event);
// Figure out if the mouse is clicking on something we want to "catch"
if (/* want this click */)
[myWindow setIgnoresMouseEvents: NO];
// Pass on the event, we must not modify it anyway, we are a listener
return event;
}鼠标事件完成后,将窗口返回为忽略鼠标事件。
https://stackoverflow.com/questions/13635056
复制相似问题