2009-06-26 3 views
3

현재 창 목록의 맨 위에있는 Finder 창의 POSIX 경로는 어떻게 얻을 수 있습니까? 코코아 프레임 워크의 어떤 종류와 함께하지만 나는 무엇이든 열려 있습니다.Finder의 전면 창 POSIX 경로 얻기

배경 : 이 경로에서 재귀 적으로 시작하여 정규식 패턴과 일치하는 파일을 선택하려고하기 때문에이 파일이 필요합니다. 아이디어는 (정규식 지원 프레임 워크를 포장 피하기 위해) 및 루프에서

[[NSWorkspace sharedWorkspace] selectFile:aFile inFileViewerRootedAtPath:thePath] 

를 사용 NSTask에서 "그렙"을 사용하여,이 경로의 모든 자손을 얻기 위해

[[NSWorkspace sharedWorkspace] subpathsAtPath:thePath] 

방법을 사용하는 것입니다 grep에서 반환 한 항목으로 NSArray를 반복합니다.

지금까지 Xcode 설명서에서 NSWorkspace, NSFileManager 및 NSApplication과 다른 키워드 검색을 살펴 보았습니다.

내 질문을 확인해 주셔서 감사합니다!

앙드레

PS : 나는 당신은 아마 애플 스크립트를 통해이 Finder를 요청할 수 있습니다

답변

3

저는 정확히 당신이 묘사하는 것을 수행하는 상업용 응용 프로그램을 개발하고 있으며, 1 년 넘게 이것을 수행하는 다양한 방법을 망쳐 놓았습니다. 저는 초보 개발자입니다. 그래서 내 방식보다 훨씬 더 나은 방법이있을 수 있다는 생각에 완전히 열려 있습니다.하지만 안정적이고 작동하는 것 같습니다.

나는 애플 스크립트

내가 활성 문서의 경로 3 초마다 얻을 사용하지만, 활성 응용 프로그램이 파인더의 경우, 나는 활성 윈도우의 경로를 얻을. Apple Script를 사용하여 승인 된 대답에 설명 된대로이 작업을 수행합니다.

:

(뭔가 애플 스크립트는 할 수 없다)이 질문에 설명 된대로, 내가 CGWindowListCopyWindowInfo를 사용하는 윈도우 ID를 얻기 위해 모든 프로세스의 창 목록을 얻으려면

탄소를 사용하여 창 목록을 얻기

Getting a unique ID for a window of another application

이렇게하면 모든 프로세스의 모든 창이 가장 앞쪽에 정렬 된 배열이 표시됩니다. 그래서 내가해야 할 일은 배열에서 첫 번째 엔트리를 뽑아내는 것뿐입니다. 이 기능은 프론트 윈도우의 스크린 그랩 (screengrab)을 얻는데도 유용합니다. 예를 들어, 잡동사니 샘플 응용 프로그램에 나와 있듯이,이 기능은 필자에게 유용합니다. 애플 스크립트에 올 때 코코아

에서 애플 스크립트를 보내기

는, 나는 짐이 시사하는 나의 결론은 각 그것이 문제입니다, 모두 안정성과 유연성의 측면에서 가지고 모든 3 실험했습니다.

  1. 애플 이벤트 매니저 원시 애플 이벤트 보내기. 나를 위해, 이것은 너무 열심히하고 너무 낮은 수준이었다.

  2. NSAppleScript를 사용하면 느리고 오류가 발생하기 쉬운 입니다. 그것은 또한 귀여운 스크립트를 보내고 싶을 때 애플 스크립트 과 같이 다양한 메시지를 보내고 있습니다. 스크립팅 다리, 에 대해 읽을 때

  3. 나는 단지 그것을 밖으로 을 시도하고 매우 실망, 매우 흥분되었다. 창문의 속성에 대해 나는 을 잡으려고 시도했지만, 심지어 으로 인식하지 못했습니다. 나에게 버그 투성이 인 이상한 것 같았다 . 전송하려는 명령이 SB에서 지원하는 인 경우 이 가장 좋으므로 옵션이 가장 좋습니다.

네 번째 옵션 지금 애플 스크립트 주위에 멋진 목표 C 래퍼에 의존

AppScript을했다. 수년 동안 계속되어 왔으며, 안정적이고, 개발자는 위대하며, 무엇보다도 그저 작동합니다.

애플 스크립트를 보낼 수있는 견고한 방법이 있습니다. 버그가 있거나 지저분한 코드를 확인해야하는 번거 로움없이 오류를 반환합니다.

저는 1 년 동안 아무런 문제없이 사용해 왔습니다. 이 작업을 수행하는 방법에 대해 다른 질문이 있으면 언제든지 주저하지 말고 답변 해 드리겠습니다.

+0

안녕하십니까. 좋은 샘플 코드와 함께 여러분의 설명이 정말 먼 길을 간다. – andreb

+0

문제가 없습니다. 추가 질문이 있으시면 언제든지이 질문을 업데이트하십시오. –

+0

안녕하세요, John, 정보 주셔서 감사합니다. 나는 SonOfGrab을 시도해 보았고 메뉴 항목과 같은 "관련이없는"창을 많이 보여 주었다. 실제로 어느 창 *이 가장 앞에 있는지를 어떻게 알 수 있습니까? – MrMage

5

... 어쩌면 난 그냥 거기에 RegexKit 라이트를 때리는 것,은 grep 부분에 대해 확실하지 않다.

이것은 * 한 줄 나를 위해 작동합니다

osascript -e 'tell application "Finder" to set myname to POSIX path of (target of window 1 as alias)' 

* this의 수정 된 버전.

+0

아아 ... 저는 AppleScript를 완전히 잊어 버렸습니다. 백업 계획으로 알면 아주 좋습니다. 코코아/카본에서 이것을 처리하기위한 포인터 또는 두 개를 아는 것이 있습니까? 나는 http://www.manytricks.com/witch가 모든 창문의 목록을 얻는 방법을 궁금해. 작성해 주셔서 감사합니다 :) – andreb

+0

다른 프로세스의 창 목록을 검사 할 수있는 Cocoa/Carbon 인터페이스에 대해 잘 모릅니다. 그리고 당신이 할 수 있다고하더라도, 당신은 그것이 어떤 길로 대응했는지를 어떻게 결정할 것입니까? –

+0

고마워요, 제가 정확히 알고 싶습니다. 별칭을 처음으로 변환하지 못했습니다. 나는 "as alias"와 "POSIX path of window (target of window 1)"대신에 "as POSIX path"와 같은 일을 시도했다. 내가 별칭으로 변환해야한다는 것을 혼란스럽게 생각합니다 ..! –

2

Finder에서 최전선 창으로 표시되는 POSIX 경로를 얻는 것이 Apple 이벤트를 Finder로 보내는 것과 관련이 있습니다.

당신의 선택은 다음과 같습니다

  • 직접 애플 이벤트 관리자 (또는 NSAppleEventDescriptor 친구)를 사용.
  • NSAppleScript 또는 OSAScript 개체 사용.
  • ScriptingBridge 사용.

코코아 앱을 제작하는 경우 OSAScript가 가장 자연스러운 선택 일 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 몇 가지 이름으로 이미 충분합니다 ... AEM/OSAScript를 살펴 봅니다. 디자이너의 마음이 너무 복잡해지면 백업 계획을 계속 고수 할 것입니다. D 다시 한 번 덕분에. 귀하의 답변이 도움이되었습니다. Andre – andreb

+0

그럼 하나를 받아들이겠습니까? –

+0

일찍 그 일을하지 않은 것에 대해 유감스럽게 생각합니다. 나는 대부분의 표를 얻은 사람이 그 상태를 자동으로 얻는다는 인상을 받았다. – andreb