2013-08-03 4 views
0

내 응용 프로그램의 주 메뉴 위에 표시되는 전체 화면 투명한 창이 있습니다. ignoresMouseEvents이 NO로 설정되어 있습니다.-SendEvent가 예상대로 동작하지 않습니다.

[NSEvent addLocalMonitorForEventsMatchingMask:NSLeftMouseDownMask handler:^(NSEvent *event) { 
    [self click:event]; 
    return event; 
}]; 

내 응용 프로그램이 활성화되어있는 동안 사용자가 클릭이 방법 click 따라서 호출 될 때마다 : 그럼에도 불구하고 마우스 클릭을 수신하려면이 코드를 추가

- (BOOL)click:(NSEvent *)event { 
    NSPoint coordinate = [event locationInWindow]; 
    float ycoord = coordinate.y; 
    float menuheight = [[NSApp mainMenu] menuBarHeight]; 
    float windowheight = [[NSApp mainWindow] frame].size.height; 
    if (ycoord >= windowheight - menuheight && ![[NSApp mainWindow] ignoresMouseEvents]) { 
     [[NSApp mainWindow] setIgnoresMouseEvents:YES]; 
     [NSApp sendEvent:event]; 
     NSLog(@"click"); 
     [[NSApp mainWindow] setIgnoresMouseEvents:NO]; 
     return YES; 
    } 
    return NO; 
} 

당신이 볼 수 있듯이를, 그것은 변경 주 메뉴 모음에있는 클릭의 경우 ignoresMouseEvents 주 창의 속성은 sendEvent:NSApplication으로 호출합니다. 마지막으로 메인 창의 ignoresMouseEvents 속성을 NO로 다시 변경합니다.

그러나 주 메뉴 모음을 클릭 할 때 로그에 '클릭'이라고 표시 되더라도 클릭은 아무 효과가 없습니다. 예를 들어 메뉴 항목 (예 : '파일'메뉴 항목)을 클릭하면 해당 메뉴 (이 경우 파일 메뉴)가 열리지 않습니다.

내가 뭘 잘못하고 있니?

답변

2

이벤트가 목표로하는 창은 응용 프로그램이 받기 전에 창 서버에 의해 결정됩니다. -sendEvent:에 전화 할 때 결정되지 않습니다. -setIgnoresMouseEvents:의 주 효과는 코코아의 내부가 아닌 윈도우 서버에 마우스 이벤트를 보내는 방법을 알려주는 것입니다.

이벤트 탭과 같은 것을 제외하고 이벤트를 받으면이를 다시 타겟팅하기에는 너무 늦었습니다.

예를 들어, NSEvent에는 -sendEvent:으로 전화하기 전에 이미 -window이 연결되어 있습니다. -sendEvent:은이를 사용하여이를 발송하려고합니다.

메뉴 모음에서 클릭을 허용하려면 메뉴 모음과 겹치지 않도록 창 크기를 지정하거나 메뉴 모음 뒤에 창 수준을 설정해야합니다.

+0

대단히 감사합니다, 우수 답변! – Fatso

관련 문제