在將Big Sur OSX 11.0替換為最新的11.5之后,我的應用程式的AXObserverAddNotification方法失敗了。下面是我測驗的示例代碼:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
NSLog(@"Hello world"/span>)。
AXUIElementRef frontMostApp = AXUIElementCreateApplication(82695); // '82695' 是我在前面運行的Xcode 12.5.1應用程式的PID參考。
NSLog(@"frontMostApp: %@",frontMostApp) 。
CFTypeRef frontMostWindow = NULL;
AXError error = AXUIElementCopyAttributeValue(frontMostApp, kAXFocusedWindowAttribute, (CFTypeRef *)&frontMostWindow) 。
if (error != kAXErrorSuccess) {
NSLog(@" failed with error: %i",error)。
}
'frontMostWindow'參考從未被創建,我得到的錯誤號碼是-25204。似乎最新的 Big Sur 11.5 修改了 Accessibility API,或者也許有一些我不知道的權限開關可以讓事情順利進行。我做錯了什么呢?
uj5u.com熱心網友回復:
使用與發布的代碼類似的代碼,我能夠讓觀察者回呼機制只在主應用程式的視窗集上作業。當我試圖在另一個應用程式的視窗上喚起回呼時,我得到了一個顯示為-25204的錯誤("發生了一個基本錯誤")--即使我在安全和隱私首選項中為該應用程式提供了可訪問性許可。這個問題是由于安裝了最新的macOS Big Sur(11.5.2版)而出現的。
我懷疑,出于安全原因,蘋果公司將不再支持在自己的應用程式之外的可訪問性編程,除非他們在新的作業系統中創建了一個錯誤。
下面的代碼在一個發布兩個視窗的應用程式上起作用,但在喚起外部應用程式(如 TextEdit)的視窗時卻不起作用。
@interface AppDelegate 。NSObject <NSApplicationDelegate> {
IBOutlet NSWindow *window1;
IBOutlet NSWindow *window2。
}
@end @end
@implementation AppDelegate>>
NSWorkspace *workspace。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
[self installFocusedWindowChangedAXObserver] 。
}
static void focusedWindowChangedCallback(AXObserverRef observer, AXUIElementRef element, CFStringRef notification, void *self){
NSLog(@"mainWindowChangedCallback") 。
NSBeep()。
}
- (AXError)installFocusedWindowChangedAXObserver {
usleep(100000); //這個暫停讓我有時間點擊除了這個程式之外的另一個程式來測驗觀察員回呼機制,如果我愿意的話。否則,這個測驗程式將發布window1和window2,當它們被交替點擊時將觸發kAXFocusedWindowChangedNotification機制,從而改變視窗焦點。
NSRunningApplication* frontMostApp = [[NSWorkspace sharedWorkspace] frontmostApplication] 。
pid_t pid = [frontMostApp processIdentifier];
NSLog(@"pid: %i",pid);
AXObserverRef observer = NULL。
AXError axErr = AXObserverCreate(pid, focusedWindowChangedCallback, &observer); //注意第二個引數是'AXObserverCallback'方法(方法簽名的嚴格程度見檔案)。
NSLog(@"axErr: %i"/span>,axErr)。
NSLog(@"observer: %@",observer);
CFRunLoopAddSource(CFRunLoopGetCurrent),
AXObserverGetRunLoopSource(observer)。
kCFRunLoopDefaultMode)。)
AXUIElementRef element = AXUIElementCreateApplication(pid); //這個應用程式的pid(觀察者的觀察者)。
NSLog(@"element: %@"/span>,element)。
axErr = AXObserverAddNotification(observer, element, kAXFocusedWindowChangedNotification, (__bridge void *)(self) 。)
NSLog(@"axErr: %i", axErr)。
return axErr;
}
@end; @end
uj5u.com熱心網友回復:
嘗試切換這一行:
CFTypeRef frontMostWindow = NULL。
到:
AXUIElementRef frontMostWindow = NULL;
從內部來說,我打賭AXUIElementCopyAttributeValue正在對你傳入的指標進行sizeof操作,以計算為結果(根據頭檔案,它以__AXUIElement結構回傳)分配的正確記憶體數量。
我的猜測是,對CFTypeRef進行sizeof()并沒有給你正確的大小,所以它不作業,你得到了那個記憶體分配錯誤代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/307444.html
標籤:
