2016-07-24 2 views
2

현재 포 그라운드 응용 프로그램이 전체 화면 모드 (다른 응용 프로그램)인지 확인하려고합니다. 나는 대답을 찾기 위해 광범위하게 봤어. 나는 Objective-C 예제를 발견했다. 나는 Objective-C 예제에서 내가 할 수있는 최선의 것을 변환했다. (나는 Objective-C에서 정말 나쁘다.) null 포인터 예외가 OSX에서 신속하게 현재 활성 창에서 경계를 가져 오려고 시도

Objective-C example

문제

는 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() 
} 

답변

1

일반적으로, 코드를 사용하고 너무 많은 ImplicitlyUnwrappedOptionals - CGRect!, UnsafeMutablePointer<CGRect>!, NSNumber!Bool!는, 그들 중 누구도해야 할 것 같다. 그러나 success : Bool! 이외의 것이 문제의 원인이 아닐 수도 있으므로 다른 사람들을 제쳐두고 설명해 드리겠습니다. (사람들은 다른 문제를 일으킬 수 있지만,이 경우는 다른 문제해야합니다.)

CGRectMakeWithDictionaryRepresentation의 서명은 다음과 같습니다. (생성 된 헤더에서 촬영)

public func CGRectMakeWithDictionaryRepresentation(dict: CFDictionary?, _ rect: UnsafeMutablePointer<CGRect>) -> Bool 

  • 반환 값은 Bool?이나 Bool!이 아닌 Bool입니다. 즉, Bool! 변수에 할당되면 변수는 항상 nil이 아닙니다. (success) != nil으로 함수가 성공했는지 여부를 확인할 수 없습니다.

  • 두 번째 매개 변수의 유형은 UnsafeMutablePointer<CGRect>입니다. C 함수 API가 UnsafeMutablePointer<T>이라고 주장하면 T 유형의 변수를 선언하고 inout 매개 변수 (접두어 &)로 전달해야합니다. 그래서

, 코드의이 라인 :

var bounds: CGRect = CGRect() 

그리고이 부분 :

   let success : Bool! = CGRectMakeWithDictionaryRepresentation((window.objectForKey(kCGWindowBounds) as! CFDictionary!), bounds) 
       if((success) != nil) 
       { 
        return bounds.memory 
       } 

것은해야

var bounds : UnsafeMutablePointer<CGRect>! = UnsafeMutablePointer<CGRect>() 

요구 같은 것을 변경합니다 like :

   let success = CGRectMakeWithDictionaryRepresentation((window.objectForKey(kCGWindowBounds) as! CFDictionary?), &bounds) 
       if success { 
        return bounds 
       } 
+0

대단히 감사합니다. 그것은 작동합니다! C- 함수로 더 많은 숙제를해야합니다.나는 충분한 점수가 없기 때문에 나는 아직 대답을 upvote 할 수 없다. –