2014-09-27 36 views
0

我在可可中創建了一個服務,它抓取選定的文本並將結果發送回我的主應用程序,所以我可以在那裏處理它(找不到任何其他方式來獲取當前選擇),現在的服務工作,並出現在服務菜單,我想從我的父應用程序調用該服務來獲得當前的選擇,一些goggling左右後,我發現這個片斷:可可調用服務,不覆蓋粘貼板

NSPasteboard *pboard = [NSPasteboard pasteboardWithUniqueName]; 
    [pboard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil]; 
    NSPerformService(@"PCB", pboard); 

這一個工作方式儘管它觸發了我的服務,但問題在於它重新定義了NSPasteboard,所以我的服務沒有得到選定的文本,但空白的NIL值粘貼板,我該如何防止?

是否有人知道如何將一個.service包轉換成一個.app包,它執行自身併發送數據並在完成後自行終止?

THX的幫助

回答

0

你想只在其它應用程序中選擇文本,對不對?可能在前端應用程序中,而您的應用程序在後臺。

爲了這個工作,你必須讓前端應用程序調用服務。如果您在後臺從您的應用中調用它,則無法訪問包含所選文本的前端應用的文本字段。相反,它會嘗試在你自己的應用程序的響應鏈中找到一個文本字段(我相信 - 如果我在這個細節上錯了,有人糾正我)。

但是,爲了讓您的代碼在應用程序的進程中運行,您必須以某種方式注入它,這是出於安全考慮 - 主要由OS X禁止,特別是在沙盒應用程序中。

有一些方法可以完成代碼注入,1Password和其他常用工具通過osax擴展使用它。但這是一個完全不同的話題。

將代碼運行到其他應用程序的進程中後,您應該能夠將選定的文本(提供它是一個Cocoa應用程序)與[NSTextView writeSelectionToPasteboard:types:]複製。但是我沒有親自測試過,所以這只是一個假設。