gpt4 book ai didi

macos - 为什么 AXUIElementCopyAttributeValue() 会为此函数中屏幕上的每个窗口返回 kAXErrorAttributeUnsupported ?

转载 作者:行者123 更新时间:2023-12-03 16:34:57 33 4
gpt4 key购买 nike

我正在尝试获取 os x 上每个可见窗口的屏幕位置。在我的函数 get_position() 中,AXUIElementCopyAttributeValue() 为屏幕上除查找器窗口之外的每个窗口返回 kAXErrorAttributeUnsupported 。为什么会这样呢?我做错了什么?

int get_position()
{
CFArrayRef a = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
NSArray * arr = CFBridgingRelease(a);
pid_t window_pid = 0;
unsigned long count = [ arr count];
NSMutableDictionary* entry;

for ( unsigned long i = 0; i < count; i++)
{
//CFTypeRef position;
AXValueRef temp;
CGPoint current_point;
entry = arr[i];
window_pid = [[entry objectForKey:(id)kCGWindowOwnerPID] intValue];
NSString * temp_ns_string = [entry objectForKey:(id)kCGWindowName ];
const char *window_name =[temp_ns_string UTF8String];
printf("%s - ", window_name);
printf("Pid: %i\n", window_pid);

AXUIElementRef window_ref = AXUIElementCreateApplication(window_pid);
AXError error = AXUIElementCopyAttributeValue(window_ref, kAXPositionAttribute, (CFTypeRef *)&temp);

if ((AXValueGetValue(temp, kAXValueCGPointType, &current_point) ))
{
printf("%s - ", window_name);
printf("Pid: %i - ", window_pid);
printf(" %f,%f\n", current_point.x, current_point.y);
}
else
{
printf("%s - ", window_name);
printf("Pid: %i\n", window_pid);
}

}
return 0;
}

最佳答案

在 MacOS 上,每个应用程序可能有多个窗口,不同的窗口使用相同的 pid。

AXUIElementRef app = AXUIElementCreateApplication(pid)

因此,您可以通过给出 kAXFocusedWindowAttribute 来获取 1 个焦点窗口

AXUIElementRef window;
AXUIElementCopyAttributeValue(app, kAXFocusedWindowAttribute, &window)

或者你可以通过给kAXWindowsAttribute来获得多窗口

NSArray *windows;
AXUIElementCopyAttributeValues(app, kAXWindowsAttribute,
0,
99999,
(CFArrayRef *) &result
);

然后从窗口获取位置或大小

AXValueRef pos;
AXValueRef size;

AXUIElementCopyAttributeValue(window, kAXPositionAttribute, (CFTypeRef *)&pos)
AXUIElementCopyAttributeValue(window, kAXSizeAttribute, (CFTypeRef *)&size)

现在,将位置转换为实际的 CGPoint 或 CGSize

CGPoint cpoint = CGPointMake(0, 0);
CGSize csize = CGSizeMake(0, 0);

AXValueGetValue(pos, kAXValueCGPointType, &cpoint);
AXValueGetValue(size, kAXValueCGSizeType, &csize);

我认为上面应该有帮助。

关于macos - 为什么 AXUIElementCopyAttributeValue() 会为此函数中屏幕上的每个窗口返回 kAXErrorAttributeUnsupported ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43385356/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com