さて、既存のコードから始めた私の最初の理論と実験は、使用可能なコードにはあまり影響しませんでした。
あなたが探しているのは、Windowsでコマンドラインシェルウィンドウで何かを実行する方法のようなものであり、プロセスが終了すると、「続行するにはQキーを押してください.. .」。ウィンドウを前面に移動して (まだ最前面にない場合)、Q キーを押すと、ウィンドウが閉じます。
このコマンド ライン ツールをプライマリ アプリケーションから呼び出す予定ですか、それともエンド ユーザーが直接操作するコマンド ライン ツールですか? (たとえば、後者の場合、ターミナル ウィンドウから呼び出す場合、うーん、Ken のコードを私のコードと組み合わせて次のようにすることができると思います。現在の形式では、これは を押した後にのみ機能することに注意してください。 Q を押して Return?
#import <Cocoa/Cocoa.h>
@interface Requestor : NSObject <NSApplicationDelegate> {
BOOL gotData;
NSFileHandle *stdIn;
}
- (void)getData;
- (void)requestorGotData:(id)sender;
@end
@implementation Requestor
- (id)init {
if (self = [super init]) {
gotData = NO;
stdIn = nil;
[NSApp setDelegate:self];
}
return self;
}
- (void)getData {
NSLog(@"getting data.........");
gotData = NO;
[self performSelector:@selector(requestorGotData:)
withObject:nil
afterDelay:5.0];
}
壊す
- (void)requestorGotData:(id)sender {
NSLog(@"got data");
gotData = YES;
NSLog(@"Press 'Q' key to continue...");
stdIn = [[NSFileHandle fileHandleWithStandardInput] retain];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(fileHandleReadCompletion:)
name:NSFileHandleReadCompletionNotification
object:stdIn];
[stdIn readInBackgroundAndNotify];
}
- (void)fileHandleReadCompletion:(NSNotification *)notification {
NSLog(@"fileHandleReadCompletion:");
NSData *data = [[notification userInfo]
objectForKey:NSFileHandleNotificationDataItem];
NSLog(@"data == %@", data);
NSString *string = [[[NSString alloc]
initWithData:data
encoding:NSUTF8StringEncoding] autorelease];
if (string) {
string = [string stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if ([[string lowercaseString] isEqualToString:@"q"]) {
[stdIn closeFile];
[stdIn release];
[[NSNotificationCenter defaultCenter] removeObserver:self];
[NSApp terminate:nil];
} else {
[stdIn readInBackgroundAndNotify];
}
}
}
@end
壊す
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
[NSApplication sharedApplication];
Requestor *requestor = [[Requestor alloc] init];
[requestor getData];
[NSApp run];
[requestor release];
[pool drain];
return 0;
}