현재 포 그라운드 응용 프로그램이 전체 화면 모드 (다른 응용 프로그램)인지 확인하려고합니다. 나는 대답을 찾기 위해 광범위하게 봤어. 나는 Objective-C 예제를 발견했다. 나는 Objective-C 예제에서 내가 할 수있는 최선의 것을 변환했다. (나는 Objective-C에서 정말 나쁘다.) null 포인터 예외가 OSX에서 신속하게 현재 활성 창에서 경계를 가져 오려고 시도
문제
는 bounds.memory이 전무하기 때문에 내가 예외를 얻을 수 있다는 것입니다. 디버거에서 메모리 포인터를 0x0000000000000000으로 경계에 표시합니다. 일부 응용 프로그램에는 실제로 창이 없으므로 제공 할 내용이 없기 때문입니다. 두 번째 이론은 응용 프로그램에 둘 이상의 창이 있지만 일부는 보이지 않습니다 (pid로 for-in 루프를 체크인하기 때문에 가능성이 더 높습니다).그럼 내가 어떻게 이러한 미지창을 인식하고 건너 뛸까요?
P.
이 질문은 StackOverflow의 첫 번째 질문입니다. 제 질문에 문제가 있으면 알려주십시오. 그에 따라 내 질문을 수정하려고 노력할 것입니다.
// Check if fullscreen application is in foreground
func appSwitched(notification: NSNotification)
{
let pid = NSWorkspace.sharedWorkspace().frontmostApplication!.processIdentifier
let bounds : CGRect! = windowBounds(pid)
print(bounds.height.description)
print(bounds.width.description)
}
// Get bounds of specified processID window
func windowBounds(pid : Int32) -> CGRect
{
var bounds : UnsafeMutablePointer<CGRect>! = UnsafeMutablePointer<CGRect>()
let windowList : CFArrayRef = CGWindowListCopyWindowInfo(CGWindowListOption.OptionOnScreenOnly, CGWindowID())!
for window in windowList as NSArray{
let id = window.objectForKey(kCGWindowOwnerPID) as! NSNumber!
if(id.intValue == pid){
if((window.objectForKey(kCGWindowOwnerName) as! String) != "MyAppName")
{
let success : Bool! = CGRectMakeWithDictionaryRepresentation((window.objectForKey(kCGWindowBounds) as! CFDictionary!), bounds)
if((success) != nil)
{
return bounds.memory
}
} else { break }
}
}
return CGRect()
}
대단히 감사합니다. 그것은 작동합니다! C- 함수로 더 많은 숙제를해야합니다.나는 충분한 점수가 없기 때문에 나는 아직 대답을 upvote 할 수 없다. –