2010-05-16 2 views
2

내 응용 프로그램은 글로벌 서비스를 제공합니다. 나는 command-alt-key 조합으로 서비스를 설치하고 싶다. 내가 지금 할 것은 정말 무슨 일이 일어나고 있는지 볼 수 없습니다로 디버깅하는 것은 매우 오류가 아닙니다 경향이 정말 어렵다 :Command Alt 키를 사용하여 NSService 등록 NSKEEquivalent

CFStringRef serviceStatusName = (CFStringRef)[NSString stringWithFormat:@"%@ - %@ - %@", appIdentifier, appName, methodNameForService]; 
CFStringRef serviceStatusRoot = CFSTR("NSServicesStatus"); 
CFPropertyListRef pbsAllServices = (CFPropertyListRef) CFMakeCollectable (CFPreferencesCopyAppValue(serviceStatusRoot, CFSTR("pbs"))); 
// the user did not configure any custom services 
BOOL otherServicesDefined = pbsAllServices != NULL; 
BOOL ourServiceDefined = NO; 
if (otherServicesDefined) { 
    ourServiceDefined = NULL != CFDictionaryGetValue((CFDictionaryRef)pbsAllServices, serviceStatusName); 
} 

NSUpdateDynamicServices(); 
NSMutableDictionary *pbsAllServicesNew = nil; 
if (otherServicesDefined) { 
    pbsAllServicesNew = [NSMutableDictionary dictionaryWithDictionary:(NSDictionary*)pbsAllServices]; 
} else { 
    pbsAllServicesNew = [NSMutableDictionary dictionaryWithCapacity:1]; 
} 

NSDictionary *serviceStatus = [NSDictionary dictionaryWithObjectsAndKeys: 
           (id)kCFBooleanTrue, @"enabled_context_menu", 
           (id)kCFBooleanTrue, @"enabled_services_menu", 
           @"@~r", @"key_equivalent", nil]; 
[pbsAllServicesNew setObject:serviceStatus forKey:(NSString*)serviceStatusName]; 
CFPreferencesSetAppValue (
          serviceStatusRoot, 
          (CFPropertyListRef) pbsAllServicesNew, 
          CFSTR("pbs")); 
Boolean result = CFPreferencesAppSynchronize(CFSTR("pbs")); 
if (result) { 
    NSUpdateDynamicServices(); 
    JLog(@"successfully installed our alt-command-R service"); 
} else { 
    ALog(@"couldn't install our alt-command-R service"); 
} 

하고 서비스를 변경하려면 :

inside Info.plist: 
<key>NSServices</key> 
<array> 
    <dict> 
    <key>NSSendTypes</key> 
    <array> 
    <string></string> 
    </array> 
    <key>NSReturnTypes</key> 
    <array> 
    <string></string> 
    </array> 
    <key>NSMenuItem</key> 
    <dict> 
    <key>default</key> 
    <string>Go To Window in ${PRODUCT_NAME}</string> 
    </dict> 
    <key>NSMessage</key> 
    <string>bringZFToForegroundZoomOut</string> 
    <key>NSPortName</key> 
    <string>com.raskinformac.${PRODUCT_NAME:identifier}</string> 
    </dict> 
</array> 

및 코드에서

제 질문은 cmd-option-key를 사용하여 서비스를 사용하는 쉬운 방법입니까? 그렇다면 소프트웨어에 기꺼이 구현할 것입니다.

+0

모든 것을 테스트하고 디버깅하는 방법을 알아 냈습니다./System/Library/CoreServices/pbs 및 NSUpdateDynamicServices 대신 정확히 실제 앱에서 실제로 얻은 내용과 마지막으로 캐시 한 내용을 정확히 알지 못합니다. * Mac에서 게스트 계정 만들기 * 이진 빌드하고 모든 의 Info.plist * * 앱 실행 는 * 표시 서비스 메뉴 다시 * * 로그 아웃 확인 여부를 결정하고 누락 뭐죠 기억 서비스 메뉴 를 참조 * 고객 에 로그인 OS X 사용자가 로그인하는 모든 물건 * 다음 번에 청소 : 전에는 전혀 알지 못했던 맥을 가지고있다. –

답변

1
<key>NSMenuItem</key> 
     <dict> 
     <key>default</key> 
     <string>Go To Window in ${PRODUCT_NAME}</string> 
     </dict> 

이며 serviceStatusName의 중간 구성 요소는 정확히 동일해야합니다. 질문에서 코드를 변경했습니다.

NSString *appServiceName = @"Go To Window in ${PRODUCT_NAME}" 
CFStringRef serviceStatusName = (CFStringRef)[NSString stringWithFormat:@"%@ - %@ - %@", appIdentifier, appServiceName, methodNameForService]; 
1

서비스 사전에서 NSKeyEquivalent의 값으로 '~'를 사용하여 키와 동일한 문자열을 설정해보십시오. Services Implementation Guide은 단일 문자 여야한다고 주장하지만 전체 키와 동일한 문자열을 시도해 볼만한 가치가 있다고 생각합니다.

NSMenuItem처럼, 그것은 사전에 싸여해야 기억 :

<key>NSKeyEquivalent</key> 
<dict> 
    <key>default</key> 
    <string>~r</string> 
</dict> 

(I는 생략 한 '@', 그것은 그것 없이는 작동하지 않을 경우, 당신이 그것을 시도 할 수 .)

작동하는 경우 설명서에 대해 filing a bug을 제안합니다.

애플은 모든 서비스가 ⌘-something 또는 ⇧⌘- 같은 키를 사용하고 메뉴 항목과 글로벌 단축키에 다른 수정자를 남겨 둘 수 있습니다. 따라서 위의 내용을 시도해 보는 동안 작동하지 않으면 너무 놀라지 않을 것입니다.

+0

피터, 대답 해 주셔서 대단히 감사합니다. 나는 ~과 @ ~ 둘 다 잘 풀리지 않았다. 하지만 문제를 발견 : 내 대답을 참조하십시오. –

관련 문제