私は .Net 開発者で、小さなプログラムを Mac OS X に移植する必要があります。これはほぼ完了しています (一部はこのサイトの人々のおかげです、ありがとう!)。
ステータスバーにあるツールを作成しています。クリックすると、いくつかのリンクまたはボタンを含むウィンドウが開きます。リンクまたはボタンをクリックすると、Web サイトまたは外部プログラムが開きます。問題は、これらの外部コマンドの 1 つを起動すると、ステータス バーのアイコンが消えることです。さらに興味深いのは、アイコンが表示されるステータス バーのスペースがまだ応答していることです。つまり、領域をクリックすると (アイコンが表示されていなくても)、コードが実行されてウィンドウが開きます。
現在のコードは次のとおりです。
トレイ.m
#import "tray.h"
#import "MyView.h"
@implementation Tray
-(void) awakeFromNib{
NSBundle *bundle = [NSBundle mainBundle];
statusItem = [[NSImage alloc] initWithContentsofFile:[bundle pathForResource:"@icon" ofType:@"png"]];
MyView *view = [MyView new];
[statusItem setImage:statusImage];
view.image = statusImage;
[statusitem setView:view];
[statusitem setToolTip:@"Tray App"];
[view setTarget:self];
[view setAction:@selector(openWindow)];
}
-(IBAction)openWindow:(id)sender{
[trayWin makeKeyAndOrderFront:nil];
}
-(IBAction)openActMon:(id)sender {
(void)system("open '\/Applications/Utilities/Activity Monitor.app'");
}
トレイ.h
#import "MyView.h"
@interface Tray : NSObject {
NSStatusItem *statusItem;
NSImage *statusImage;
IBOutlet NSWindow * trayWin;
IBOutlet NSButton *ActMon;
void *openWindow;
}
@property (retain,nonatomic) NSStatusItem *statusItem;
-(IBAction)ActMon:(id)sender;
@end
MyView.h
@interface MyView : NSControl {
NSImage *image;
id target;
SEL action;
}
@property (retain)NSImage *image;
@property (assign) id target;
@property (assign) SEL action;
@end
MyView.m
#import "MyView.h"
@implementation MyView;
@synthethize image, target, action;
-(void)mousemouseUP:(NSEvent *)event{
[NSApp sendAction:selfself.action to:self.target from:self];
}
-(void)dealloc {
self.image = nil;
[super dealloc];
}
-(void)drawRect:(NSRect)rect {
[self.image drawInRect:CGRectMake(0,0,18,18) fromRect:NSZeroRect operation:NSCompositeSourceOver];
}
@end
}
画像/ボタンがクリックされると openActMon が実行され、画像はアイコンがクリックされると開かれるtrayWinウィンドウに配置されます。この時点で、Activity Monitor は正常に起動しますが、StatusBar のアイコンが消えます。
[super setNeedsDisplay:YES] を openActMon に入れてみましたが、役に立ちませんでした。そして、openActMon に [view setNeedsDisplay:YES] を追加すると、未宣言で応答しました。
前述したように、私は Objective-C のコーダーではなく、何か小さなものを移植する必要がある .Net であるため、このコードをすべて提供しました。これが将来他の人に役立つことを願っています。これの多くは、さまざまなフォーラムやサイトから寄せ集めたり、StackOverflow のヘルプから得たりしたものです。誰かが助けてくれることを願っています。
前もって感謝します!