Objective c NSPanel未接收鼠标标记事件

Objective c NSPanel未接收鼠标标记事件,objective-c,xcode,cocoa,draggable,nswindow,Objective C,Xcode,Cocoa,Draggable,Nswindow,我有一个无边界的NSPanel,当我第一次启动它并且它有焦点时,我可以拖动它,正确触发mousedragged方法,但是当我将焦点切换到另一个应用程序,然后返回到NSPanel(它使用NSNonactivatingPanelMask设置)时,我不再接收mousedragged事件 我仍然会收到mouseup和mousedown事件,所以我不知道mousedragged事件为什么没有执行 有什么想法吗 下面是它如何初始化的: _panel = [[MyPanel alloc] initWi

我有一个无边界的NSPanel,当我第一次启动它并且它有焦点时,我可以拖动它,正确触发mousedragged方法,但是当我将焦点切换到另一个应用程序,然后返回到NSPanel(它使用NSNonactivatingPanelMask设置)时,我不再接收mousedragged事件

我仍然会收到mouseup和mousedown事件,所以我不知道mousedragged事件为什么没有执行

有什么想法吗

下面是它如何初始化的:

   _panel  = [[MyPanel alloc] initWithContentRect:frame
              styleMask:NSBorderlessWindowMask | NSNonactivatingPanelMask
              backing:NSBackingStoreBuffered
              defer:NO];
我还尝试将所有这些方法添加到我的panel类中:

- (BOOL)canBecomeKeyWindow {
    return YES;
}

- (BOOL)canBecomeMainWindow
{
    return YES;
}

- (BOOL)canBecomeFirstResponder {
    return YES;
}

- (BOOL)acceptsFirstResponder
{
    return YES;
}

- (BOOL)acceptsFirstMouse
{
    return YES;
}
并使其成为鼠标按下时的第一响应者(它仍然接收):

鼠标标记仅包含以下内容:

- (void)mouseDragged:(NSEvent *)theEvent
{
    [self setBackgroundColor:[NSColor greenColor]];
    [self display];
    NSLog(@"dragged");
}
我不希望窗口获得焦点。(重点应放在下面的第三方应用程序上)

更新:我添加了一个示例项目,请在此处下载:

正如您将看到的,当您第一次运行应用程序并拖动它时,它将在console.log中连续输出“dradded”(并且背景颜色将为绿色)。如果随后切换到另一个应用程序,然后返回到movingpanel应用程序,则拖动将不再输出任何内容。(背景颜色为红色,在mousedown事件处理程序中设置)

如果没有NSNOACTIVATINGPANELMASK,这将正常工作,但面板下方的窗口保持活动状态至关重要。如果有其他方法可以实现这一点,请分享


我还注意到一件事,如果你双击面板(快速),然后拖动,它会变成绿色(因此会调用mousedragged:),但它不会移动。。。不知道该怎么想

我还注意到,如果我这样做[self-setMovableByWindowBackground:NO];然后它也会正常工作。我打赌setMovableByWindowBackground的工作方式会干扰mouseDragged的调用。这可能是一个错误,它被称为在所有

我想一个可能的解决方案是实现自己的窗口拖动

如果你真正感兴趣的是当窗口移动时的响应,这个问题和答案可能会提供你所需要的


谢谢,这正是问题所在!
- (void)mouseDragged:(NSEvent *)theEvent
{
    [self setBackgroundColor:[NSColor greenColor]];
    [self display];
    NSLog(@"dragged");
}