Objective c 如何在Mac OSX上获取窗口标题列表?

Objective c 如何在Mac OSX上获取窗口标题列表?,objective-c,macos,api,Objective C,Macos,Api,我想获取当前运行的应用程序的窗口标题列表 在windows上,我有EnumWndProc和GetWindowText 在Linux上,我有XGetWindowProperty和XFetchName 本机Mac等效物是什么?一些可能有用的参考资料: 及 和(要求10.5) CGSGetWindowProperty() CGSGetWindowProperty是,但我相信您可以将它和NSWindowList()项一起使用,如下所示(完全未经测试): 您可以在应用程序中使用或用作ObjC app

我想获取当前运行的应用程序的窗口标题列表

在windows上,我有EnumWndProc和GetWindowText

在Linux上,我有XGetWindowProperty和XFetchName


本机Mac等效物是什么?

一些可能有用的参考资料:

  • 和(要求10.5)
  • CGSGetWindowProperty()
CGSGetWindowProperty
是,但我相信您可以将它和
NSWindowList()项一起使用,如下所示(完全未经测试):

您可以在应用程序中使用或用作ObjC applescript桥来调用applescript。对于Leopard,您可以使用(更多未经测试的代码):

如果你不在乎可读性,你甚至可以在一个长通话中尝试一下

SystemEventsApplication *systemEvents = [SBApplication applicationWithBundleIdentifier:@"com.apple.systemevents"];
NSArray *titles = [[[systemEvents processes] 
                     arrayByApplyingSelector:@selector(windows)] 
               arrayByApplyingSelector:@selector(arrayByApplyingSelector:) 
               withObject:@selector(title)];

编译器会抱怨
@selector(title)
是错误的类型,但它应该可以工作。手动滚动一些委托,您可以将调用转换为
[[[systemEvents processs]windows]title]

浮动的CGSPrivate.h头与OS X 10.8不直接兼容,因为CGSGetWindowProperty()不再存在(当然,它确实存在,但您无法再链接到它)。因此,将这两行代码添加到CGSPrivate.h文件中——我在谷歌上搜索了好几个小时后才发现了这一点——以使其正常工作:

extern CGSConnection CGSDefaultConnectionForThread(void);
外部CGError CGSCopyWindowProperty(常量CGSConnection cid、NSInteger wid、CFStringRef键、CFStringRef*输出);
根据outis的代码,这里有一种迭代每个窗口标题的方法。我已经在山狮上用铿锵4.2测试了这一点:

CFStringRef标题值;
CGSConnection connection=CGSDefaultConnectionForThread();
NSInteger windowCount,*窗口;
nscount窗口(&windowCount);
windows=(NSInteger*)malloc(windowCount*sizeof(NSInteger));
如果(windows){
NSWindowList(windowCount,windows);
对于(int i=0;i
我发现的其他一些东西包括:

  • 没有窗口标题超过127字节
  • 窗口标题用kCFStringEncodingMacRoman编码
  • 因此,如果您希望将其作为C字符串,请编写如下内容:

    char*cTitle[127]={0};
    CFStringGetCString(标题值,cTitle,127,kCFStringEncodingMacRoman);
    
    就我个人而言,我建议这样做,因为可访问性API非常麻烦,需要额外的权限


    希望这对别人有帮助!干杯

    请注意,AppleScript使用的是可访问性接口,这些接口是公共的,具有C等价物(请参阅)。CGS*API不仅没有文档记录,而且随时可能更改。(因此,只有在您愿意在新的操作系统版本上进行早期和经常测试并且没有其他选择的情况下,才可以使用它们。)您有无可访问性API的使用示例?我本来希望包括它,但对它不够熟悉,无法提供如何使用它。而且,它要求启用可访问性。你知道吗?我刚刚测试了AppleScript解决方案,获取windows列表还需要启用可访问性。示例可访问性API代码:Thanx用于此答案,但可移植性如何?
    CGS\u xx
    找不到和/或被
    10.6
    弃用。我的代码是10.8.2ml,当然不能依赖于不推荐的东西。与其说它找不到,不如说它变了。我在上面所做的反向工作提供了正确的签名,允许您使用
    CGS\u xx
    解决此特定问题。除了窗口标题,我什么都没试过。如果您觉得需要使用此软件包,您可能应该发布多个版本的软件包(即10.6及以下版本或10.7以上版本)
    tell application "System Events" to get the title of every window of every process
    
    SystemEventsApplication *systemEvents = [SBApplication applicationWithBundleIdentifier:@"com.apple.systemevents"];
    SBElementArray *processes = [systemEvents processes];
    for (SystemEventsProcess* process in processes) {
        NSArray *titles = [[process windows] arrayByApplyingSelector:@selector(title)];
    }
    
    SystemEventsApplication *systemEvents = [SBApplication applicationWithBundleIdentifier:@"com.apple.systemevents"];
    NSArray *titles = [[[systemEvents processes] 
                         arrayByApplyingSelector:@selector(windows)] 
                   arrayByApplyingSelector:@selector(arrayByApplyingSelector:) 
                   withObject:@selector(title)];