2012-01-27 9 views
6

मैं माउस कर्सर स्थिति पर NSMenu प्रदर्शित करके हॉट कुंजी प्रेस पर प्रतिक्रिया करना चाहता हूं।मैं माउस कर्सर स्थिति पर एनएसएमएनयू कैसे पॉप अप कर सकता हूं?

मेरा आवेदन UIElement है और इसकी अपनी खिड़की नहीं है।

मैं वहाँ पता NSMenu की विधि है:

-(void)popUpContextMenu:(NSMenu *)menu 
       withEvent:(NSEvent *)event 
       forView:(NSView *)view; 

लेकिन यह जब कोई दृश्य :(है वहाँ यह काम नहीं करता लगता है

मैं माउस कर्सर स्थिति पर एक नकली पारदर्शी दृश्य बनाने चाहिए। , और फिर वहाँ प्रदर्शित NSMenu, या वहाँ बेहतर तरीका है?

यह कार्बन का उपयोग कर कार्यान्वित किया जा सकता कर सकते हैं?

+0

आपको एक नकली पारदर्शी दृश्य बनाने की कोशिश की? क्या होता है? –

+0

@RobKeniger - मैंने समाधान पोस्ट किया है। यह काम करता हैं। – flagman

उत्तर

14

उपयोग:

[theMenu popUpMenuPositioningItem:nil atLocation:[NSEvent mouseLocation] inView:nil]; 
1

यहाँ समाधान है जो पारदर्शी खिड़की का उपयोग करता है:

+ (NSMenu *)defaultMenu { 
    NSMenu *theMenu = [[[NSMenu alloc] initWithTitle:@"Contextual Menu"] autorelease]; 
    [theMenu insertItemWithTitle:@"Beep" action:@selector(beep:) keyEquivalent:@"" atIndex:0]; 
    [theMenu insertItemWithTitle:@"Honk" action:@selector(honk:) keyEquivalent:@"" atIndex:1]; 
    return theMenu; 
} 

- (void) hotkeyWithEvent:(NSEvent *)hkEvent 
{ 
    NSPoint mouseLocation = [NSEvent mouseLocation]; 

    // 1. Create transparent window programmatically. 

    NSRect frame = NSMakeRect(mouseLocation.x, mouseLocation.y, 200, 200); 
    NSWindow* newWindow = [[NSWindow alloc] initWithContentRect:frame 
                styleMask:NSBorderlessWindowMask 
                 backing:NSBackingStoreBuffered 
                 defer:NO]; 
    [newWindow setAlphaValue:0]; 
    [newWindow makeKeyAndOrderFront:NSApp]; 

    NSPoint locationInWindow = [newWindow convertScreenToBase: mouseLocation]; 

    // 2. Construct fake event. 

    int eventType = NSLeftMouseDown; 

    NSEvent *fakeMouseEvent = [NSEvent mouseEventWithType:eventType 
               location:locationInWindow 
              modifierFlags:0 
               timestamp:0 
              windowNumber:[newWindow windowNumber] 
                context:nil 
               eventNumber:0 
               clickCount:0 
               pressure:0]; 
    // 3. Pop up menu 
    [NSMenu popUpContextMenu:[[self class]defaultMenu] withEvent:fakeMouseEvent forView:[newWindow contentView]]; 

}

यह काम करता है, लेकिन मैं अभी भी और अधिक सुरुचिपूर्ण समाधान के लिए देख रहा हूँ। इस बजाय

+0

क्या आपको कभी बेहतर समाधान मिला है? दुर्भाग्यवश – Wesley

+0

@ वेस्ले नहीं। अभी भी कई परियोजनाओं में इसका उपयोग कर रहे हैं :( – flagman

+9

ऐसा लगता है कि यह थोड़ा बेहतर काम करता है? [मेनू पॉपअपमेनूपोशनिंग इटिम: शून्य पर स्थान: [एनएसईएंड माउसलोकेशन] इनव्यू: शून्य]; – Wesley

संबंधित मुद्दे