过滤窗口修改事件

时间:2016-01-03 13:06:57

标签: objective-c nsevent

我有这个消息循环:

while (!shutdown_now_) 
    {
        NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
        NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask
                                            untilDate:[NSDate distantFuture]
                                               inMode:NSDefaultRunLoopMode
                                              dequeue:YES];
        if (event) [NSApp sendEvent:event];
        // If modifying window event, do something!!! 
        [pool drain];
    } 

我想过滤修改窗口的所有NSEvent,例如移动,调整大小,排序e.t.c.我试图在Apple documentation中寻找类型,但没有成功。有帮助吗?谢谢!

2 个答案:

答案 0 :(得分:2)

过滤事件不是正确的方法。

如果您不想让用户移动窗口,请将窗口的movable属性设置为false。

如果您不想让用户调整窗口大小,请将窗口styleMask设置为不包括NSResizableWindowMask。或者,可能将其contentMinSizecontentMaxSize设置为其当前大小。

没有事件可以直接命令窗口。窗口的委托通过实现-windowShouldClose:来决定关闭按钮是否实际关闭了窗口。如果您根本不想启用关闭按钮,请将styleMask设置为不包括NSClosableWindowMask

答案 1 :(得分:0)

我正在寻找的事件类型是NSAppKitDefined

while (!shutdown_now_) 
    {
        NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
        NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask
                                            untilDate:[NSDate distantFuture]
                                               inMode:NSDefaultRunLoopMode
                                              dequeue:YES];
        if (event.type == NSAppKitDefined)
        {
            NSLog(@"NSAppKitDefinedEvent with subtype: %d", event.subtype);
        }
        if (event) [NSApp sendEvent:event];
        [pool drain];
    }