アトトックラボ

2010年12月29日

NSScreenでスクリーンの情報を取得

Posted by Yoichi Kurusaki
メニューバーが表示されているスクリーンの情報

[NSScreen mainScreen]は、メニューバーが表示されているスクリーンの情報だと勘違いしてしまうが、これはフォーカスのあるウィンドウが表示されているスクリーンの情報を保持している。
一台のモニターを使っている場合は問題が発生することはないが、マルチモニターの環境では使い方を間違わないようにしないといけない。

メニューバーが表示されているスクリーンの情報は[NSScreen screens]の0番目に入っている。

    [[NSScreen screens]objectAtIndex:0]

対象のウィンドウが表示されているスクリーンの情報は、NSWindowから取得できる。

    NSScreen *screen = [window screen] ;
マルチスクリーンの状態

下記のようなマルチモニターにした状態でNSScreenの値を確認したみた。

20101229021000.png

















左右のそれぞれのスクリーンにウィンドウを表示し下記のコードでNSScreenの状態を確認してみた。

NSLog(@"NSScreen mainScreen : %@",NSStringFromRect([[NSScreen mainScreen] frame]));
NSLog(@"NSScreen screens 0 : %@",NSStringFromRect([[[NSScreen screens] objectAtIndex:0]frame]));
NSLog(@"[self.window screen] : %@",NSStringFromRect([[self.window screen] frame]));
右側のメニューバーが表示されているスクリーンにウィンドウがあった場合
2010-12-29 02:09:25.249 SampleApp[3336:a0f] NSScreen mainScreen : {{0, 0}, {1680, 1050}}
2010-12-29 02:09:25.250 SampleApp[3336:a0f] NSScreen screens 0 : {{0, 0}, {1680, 1050}}
2010-12-29 02:09:25.250 SampleApp[3336:a0f] [self.window screen] : {{0, 0}, {1680, 1050}}

すべて右側のスクリーンの情報が設定されている。

左側のスクリーンにウィンドウがあった場合
2010-12-29 02:09:34.158 SampleApp[3336:a0f] NSScreen mainScreen : {{-1280, 26}, {1280, 1024}}
2010-12-29 02:09:34.158 SampleApp[3336:a0f] NSScreen screens 0 : {{0, 0}, {1680, 1050}}
2010-12-29 02:09:34.158 SampleApp[3336:a0f] [self.window screen] : {{-1280, 26}, {1280, 1024}}

ウィンドウが左側にあるため、[NSScreen mainScreen]と[self.window screen]には
左側のスクリーンの情報が設定されている。
[self.window screen]は、ウィンドウが表示されているスクリーンの情報が設定され、
[NSScreen mainScreen]にはフォーカスのあるウィンドウが表示されているスクリーンの情報が設定される。
[[NSScreen screens] objectAtIndex:0]にはメニューバーがあるスクリーンの情報が設定されるため
左側のスクリーンの情報となっている。