2011-12-18 10 views
0

グローバルホットキーの作成についてこの記事を読んでいます。私はチュートリアルを成功させましたが、今はObjective-Cメソッドを伝えようとしていますが、私は立ち往生しています。 Objective-CをC++コードからメッセージする方法はありますか?C++メソッドのメッセージングObjective-Cメソッド?

http://cocoasamurai.blogspot.com/2009/03/global-keyboard-shortcuts-with-carbon.html

私のコードがでているのはここです:

#import "AppDelegate.h" 
#import <Carbon/Carbon.h> 

@implementation AppDelegate 

@synthesize window = _window; 
@synthesize statusItem; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    EventHotKeyRef myHotKeyRef; 
    EventHotKeyID myHotKeyID; 
    EventTypeSpec keyPressedEventType; 
    EventTypeSpec keyReleaseEventType; 

    keyPressedEventType.eventClass=kEventClassKeyboard; 
    keyPressedEventType.eventKind=kEventHotKeyPressed; 

    keyReleaseEventType.eventClass=kEventClassKeyboard; 
    keyReleaseEventType.eventKind=kEventHotKeyReleased; 

    InstallApplicationEventHandler(&keyPressedHandler, 1, &keyPressedEventType, NULL, NULL); 
    InstallApplicationEventHandler(&keyReleasedHandler, 1, &keyReleaseEventType, NULL, NULL); 

    myHotKeyID.signature='mhk1'; 
    myHotKeyID.id=1; 

    RegisterEventHotKey(97, 0, myHotKeyID, GetApplicationEventTarget(), 0, &myHotKeyRef); 
} 

- (void)awakeFromNib 
{ 
    statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength]; 
    [statusItem setMenu:statusMenu]; 
    [statusItem setImage:[NSImage imageNamed:@"microphone_muted"]]; 
    [statusItem setAlternateImage:[NSImage imageNamed:@"neg_microphone_muted"]]; 
    [statusItem setHighlightMode:YES]; 
} 
- (void) mute 
{ 
    [statusItem setImage:[NSImage imageNamed:@"microphone_muted"]]; 
    [statusItem setAlternateImage:[NSImage imageNamed:@"neg_microphone_muted"]]; 
} 
- (void) unmute 
{ 
    [statusItem setImage:[NSImage imageNamed:@"microphone"]]; 
    [statusItem setAlternateImage:[NSImage imageNamed:@"neg_microphone"]]; 
} 
OSStatus keyPressedHandler(EventHandlerCallRef nextHandler, EventRef anEvent, void *userData) 
{ 
    NSLog(@"Unmute mic"); 
    return noErr; 
} 
OSStatus keyReleasedHandler(EventHandlerCallRef nextHandler, EventRef anEvent, void *userData) 
{ 
    NSLog(@"Mute mic"); 
    return noErr; 
} 
@end 

答えて

3

あなたのC++ソースファイルが(代わりに.cppの)延長.mmを持っている場合、それは客観的なC++としてコンパイルされ、あなたされますまるで標準の.mソースファイルを使用しているかのようにObjective-Cオブジェクトにメッセージを送信できます。

+0

質問が間違っている可能性があります。私の意図は、何とかC++のメソッドの内部でアプリケーションデリゲートを参照することでした。そのため、keyPressedHandler内部からミュートメソッドにメッセージを送ることができました。私は、InstallApplicationEventHandlerメソッドのuserDataパラメータで参照を送信しなければならなかったことが判明しました。 – Sandro

+0

ファイル名を.mmに変更してしまいましたが(これは規約なので)、.m拡張子を維持したままC++関数内でObjective-C構文を使用できることに気付きました。私は最新のXcode 4を使用していました。これはすべて1つのファイル、btwです。 – Sandro

+0

ああ、知っておいてよかった。更新していただきありがとうございます。 – gschandler

1

ファイルの拡張子を変更する必要はありません。 RMB/"show info"やC++ファイルの何かを行い、タイプを "cpp"から "objective_c/cpp"などに変更します(実際の値が何であるか忘れてしまいます)。

次に、C++とObjective-Cをあなたの心臓のコンテンツに混在させることができます。

+2

これは悪い考えです。命名規則に従うことで問題は解決され、プロジェクトを見ている人は、.mmファイルがObjective-C++としてコンパイルされることを認識できます。 – NSResponder

+0

ファイルが主にC++で、Objective-Cのばらつきがある場合は、C++にラベルを付ける方が理にかなっています。 (Objective-Cも含まれていますが、Xcodeでも 'main'はCと書かれています) –

+0

Objective-Cをソースに導入すると、もはやC/C++ではなくなりました。あなたが記述するテクニックは役に立ちますが、状況によっては十分ですが、矛盾のない命名規則を守ることが大切です。 – gschandler