Youtube プレーヤーは、スクリーンセーバーが起動しないようにするために偽のユーザー入力イベントを送信しているようです (私は osx/safari を使用していますが、Windows でも同じことが起こります)。これは、埋め込みプレーヤーと yt サイトのプレーヤーの両方で発生します。これは、ビデオを見ようとしているときにスクリーンセーバーが邪魔にならないようにするための設計によるものだと思います。
ただし、スクリーンセーバー内から YouTube ビデオを再生しようとしているので、これらのイベントをトラップして無視するか、オフにしたいと考えています。 私のスクリーンセーバーは、ユーザーがマウスを動かしたかのように正常に終了すると、6 ~ 8 秒間うまく機能します。Windowsではキャッチして無視できると思いますが、OSX用に書いているので、コードに到達しないため、コードにトラップできないようです-ScreenSaverEngineアプリによって処理されます。Mac スクリーンセーバーはこのアプリのプラグインであるため、メイン イベント ループ (NSApplication::sendEvent を呼び出す) をオーバーライドすることはできません。このイベントについて最初に耳にしたのは、applicationShouldTerminate() デリゲートです。後でアプリを終了するようにリクエストできますが、シャットダウンが延期されるのは約 1 秒だけです。スタック トレースは以下のとおりです。MouseExit アップル イベントが送信されていることがわかります。
ココアでもJavaScriptでも、これらのプレーヤーイベントを無効にしたりキャッチしたりする方法が見つかりません。私の実際のビデオは WebView に読み込まれ、YouTube JavaScript API を使用して実行されますが、以下のストリップされたテスト コードは同じ結果を生成します。次のようにして、コードを実行しなくても同じ結果が得られます。
(1) YouTube でビデオを再生します (埋め込まれているかどうかは関係ありません) (2) ホットコーナーなどを介して手動でスクリーンセーバーを開始します (3) 数秒待ちます
Objective-C と JavaScript は初めてなので、これは長い間コードのバグだと思っていましたが、コードをまったく使用せずに上記の手順で問題が再現されるため、設計によるものだと思います。
スクリーンセーバー テスト コード ----- .h ファイル
#import <WebKit/WebKit.h>
#import <ScreenSaver/ScreenSaver.h>
@interface YtTestView : ScreenSaverView
{
WebView * webView;
}
@end
スクリーンセーバー テスト コード ----- .m ファイル - この例ではほとんどのパラメーターが不必要だと思いますが、これは Alastair Tse ( https://github.com/liquidx/webviewscreensaver )による優れた例から採用されました。
#import "YtTestView.h"
@implementation YtTestView
- (id)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview
{
self = [super initWithFrame:frame isPreview:isPreview];
if (self) {
[self setAnimationTimeInterval:1/30.0];
}
return self;
}
- (void)startAnimation
{
[super startAnimation];
webView = [[WebView alloc] initWithFrame:[self bounds]];
[webView setFrameLoadDelegate:self];
[webView setShouldUpdateWhileOffscreen:YES];
[webView setPolicyDelegate:self];
[webView setUIDelegate:self];
[webView setEditingDelegate:self];
[webView setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable];
[webView setAutoresizesSubviews:YES];
[webView setDrawsBackground:NO];
[webView setMaintainsBackForwardList:NO];
[self addSubview:webView];
NSString * url= @"http://www.youtube.com/embed/NleT--L6fNo?autoplay=1";
[webView setMainFrameURL:url];
}
- (void)stopAnimation
{
[super stopAnimation];
}
- (void)drawRect:(NSRect)rect
{
[super drawRect:rect];
}
- (void)animateOneFrame
{
return;
}
- (BOOL)hasConfigureSheet
{
return NO;
}
- (NSWindow*)configureSheet
{
return nil;
}
@end
--------applicationShouldTerminate() のスタック トレース - 参考までに
2013-05-20 23:41:20.558 ScreenSaverEngine[2143:c07] イベント: NSEvent: type=Kitdefined loc=(0,800) time=21467.6 flags=0 win=0x0 winNum=0 ctxt=0x0 サブタイプ=1 data1=619 data2 =0 2013-05-20 23:41:20.558 ScreenSaverEngine[2143:c07] ウィンドウ ClassName: (null) 2013-05-20 23:41:20.559 ScreenSaverEngine[2143:c07] イベント: type=13 2013-05-20 23:41:20.561 ScreenSaverengine [2143:C07] 0:0 YTSS 0x0000000106167327- [YTSSVIEW(NSAPPLICATIONDELEGATE)アプリケーション:] + 343 2013-05-20 23:41:20.562スクリーンベレンギン[2143:143:41:41:41:41 NSApplication _docController:shouldTerminate:] + 75 2013-05-20 23:41:20.562 ScreenSaverEngine[2143:c07] 2: 2 AppKit 0x00007fff85623d7e __91-[NSDocumentController(NSInternal) _closeAllDocumentsWithDelegate:shouldTerminateSelector:]_block_invoke_0 + 159 2013-05-20 23:41:20.562 ScreenSaverEngine[2143:c07] 3: 3 AppKit 0x00007fff85623c1a -[NSDocumentController(NSInternal) _closeAllDocumentsWithDelegate:shouldTerminateSelector:] + 1557 3-003:2013 ScreenSaverengine [2143:C07] 4:4 AppKit 0x00007FFF856235DE- [NSDOCUMENTCONTROLLER(NSINTERNAL)__CLOSEALLDOCUMESSWITHDELEGATE:SefderterminateSelector:] + 265 2013-05-20 23:41:20.563 Screenverengiin + 772 2013-05-20 23:41:20.563 ScreenSaverEngine[2143:c07] 6: 6 AppKit 0x00007fff8565127f -[NSApplication(NSAppleEventHandling) _handleAEQuit] + 403 2013-05-20 23:41:20.566 ScreenSaverEngine[21] 4 3:c07 :7 AppKit 0x00007fff854001b1 -[NSApplication(NSAppleEventHandling) _handleCoreEvent:withReplyEvent:] + 660 2013-05-20 23:41:20.567 ScreenSaverEngine[2143:c07] 8: 8 Foundation 0x00007fff8ea2370b -[NSAppleEventManagerdispatchRawReplyCon3:0 -05-20 23:41:20.567 ScreenSaverEngine[2143:c07] 9: 9 Foundation 0x00007fff8ea2356d _NSAppleEventManagerGenericHandler + 106 2013-05-20 23:41:20.567 ScreenSaverEngine[2143:c07] 10: 10 AE 0x00007fff906fa078 _Z20aeDispatchAppleEventPK6AEDescPS_jPh + 307 2013-05 -20 23:41:20.567 ScreenSaverEngine[2143:c07] 11:11 AE 0x00007fff906f9ed911 AE 0x00007fff906f9ed911 AE 0x00007fff906f9ed9] + 660 2013-05-20 23:41:20.567 ScreenSaverEngine[2143:c07] 8: 8 Foundation 0x00007fff8ea2370b -[NSAppleEventManager dispatchRawAppleEvent:withRawReply:handlerRefCon:] + 308 2013-05-20 23:41:20.567 ScreenSaverEngine:[2 c07] 9: 9 Foundation 0x00007fff8ea2356d _NSAppleEventManagerGenericHandler + 106 2013-05-20 23:41:20.567 ScreenSaverEngine[2143:c07] 10: 10 AE 0x00007fff906fa078 _Z20aeDispatchAppleEventPK6AEDescPS_jPh + 307 2013-05-20 23:41:20.567 ScreenSaverEngine[2143:c07] 11: 11AE 0x00007fff906f9ed9] + 660 2013-05-20 23:41:20.567 ScreenSaverEngine[2143:c07] 8: 8 Foundation 0x00007fff8ea2370b -[NSAppleEventManager dispatchRawAppleEvent:withRawReply:handlerRefCon:] + 308 2013-05-20 23:41:20.567 ScreenSaverEngine:[2 c07] 9: 9 Foundation 0x00007fff8ea2356d _NSAppleEventManagerGenericHandler + 106 2013-05-20 23:41:20.567 ScreenSaverEngine[2143:c07] 10: 10 AE 0x00007fff906fa078 _Z20aeDispatchAppleEventPK6AEDescPS_jPh + 307 2013-05-20 23:41:20.567 ScreenSaverEngine[2143:c07] 11: 11AE 0x00007fff906f9ed9567 ScreenSaverEngine[2143:c07] 9: 9 Foundation 0x00007fff8ea2356d _NSAppleEventManagerGenericHandler + 106 2013-05-20 23:41:20.567 ScreenSaverEngine[2143:c07] 10: 10 AE 0x00007fff906fa078 _Z20aeDispatchAppleEventPK6AEDescPS_jPh + 307 2013-05-20 23:41:20.567 ScreenSaverEngine [2143:c07] 11:11 AE 0x00007fff906f9ed9567 ScreenSaverEngine[2143:c07] 9: 9 Foundation 0x00007fff8ea2356d _NSAppleEventManagerGenericHandler + 106 2013-05-20 23:41:20.567 ScreenSaverEngine[2143:c07] 10: 10 AE 0x00007fff906fa078 _Z20aeDispatchAppleEventPK6AEDescPS_jPh + 307 2013-05-20 23:41:20.567 ScreenSaverEngine [2143:c07] 11:11 AE 0x00007fff906f9ed9ZL25dispatchEventAndSendReplyPK6AEDescPS17 AppKit 0x00007FFF853F31D3- [NSAPPLICATION RUN] + 517 2013-05-20 23:41:20.571 ScreenSaverengine [2143:C07] 18:18 ScreenSaverengine 0x0000000104B6E5A3 Main + 551 2013-05-20 23:41:441:41:41:41:41:41:41:41:41:441 19:19 libdyld.dylib 0x00007fff907b47e1 start + 0 2013-05-20 23:41:20.571 ScreenSaverEngine[2143:c07] 20:20??? 0x0000000000000001 0x0 + 1 20??? 0x0000000000000001 0x0 + 1 20??? 0x0000000000000001 0x0 + 1