グローバルホットキーの作成についてこの記事を読んでいます。私はチュートリアルを成功させましたが、今は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
質問が間違っている可能性があります。私の意図は、何とかC++のメソッドの内部でアプリケーションデリゲートを参照することでした。そのため、keyPressedHandler内部からミュートメソッドにメッセージを送ることができました。私は、InstallApplicationEventHandlerメソッドのuserDataパラメータで参照を送信しなければならなかったことが判明しました。 – Sandro
ファイル名を.mmに変更してしまいましたが(これは規約なので)、.m拡張子を維持したままC++関数内でObjective-C構文を使用できることに気付きました。私は最新のXcode 4を使用していました。これはすべて1つのファイル、btwです。 – Sandro
ああ、知っておいてよかった。更新していただきありがとうございます。 – gschandler