如何从 applescript 获取 windowid

how to get windowid from applescript

我正在尝试获取每个 window 的 window id。

set r to {}
tell application "System Events"
    repeat with t in windows of processes
        set sid to id of t
        set end of r to {title:title of t, id:sid}
    end repeat
end tell
r

以上代码returns

error "System Events got an error: Can’t get id of item 1 of every window of every process." number -1728 from id of item 1 of every window of every process

如何获取每个 window 的 window id?

我为您编写了一个 Objective-C 小程序,可以获取 window 所有者、window 名称和 window id:

////////////////////////////////////////////////////////////////////////////////
// windowlist.m
// Mark Setchell
//
// Get list of windows with their WindowOwnerNames, WindowNames and WindowNumbers
//
// Compile with:
// clang windowlist.m -o windowlist -framework coregraphics -framework cocoa
//
// Run with:
// ./windowlist
//
// You can then run "screencapture" to capture that window:
//
// screencapture -l<windowid> -x someFile.[png|jpg|tif]
////////////////////////////////////////////////////////////////////////////////
#include <Cocoa/Cocoa.h>
#include <CoreGraphics/CGWindow.h>

int main(int argc, char **argv)
{
   NSArray *windows = (NSArray *)CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements|kCGWindowListOptionOnScreenOnly,kCGNullWindowID);
   for(NSDictionary *window in windows){
      int WindowNum = [[window objectForKey:(NSString *)kCGWindowNumber] intValue];
      NSString* OwnerName = [window objectForKey:(NSString *)kCGWindowOwnerName];
      NSString* WindowName= [window objectForKey:(NSString *)kCGWindowName];
      printf("%s:%s:%d\n",[OwnerName UTF8String],[WindowName UTF8String],WindowNum);
   }
}

输出

./windowlist

Preview:(null):300
Safari:(null):48
Terminal:(null):231
VirtualBox:(null):212
Mail:(null):150
Dropbox:(null):181
Finder:(null):118
Notification Center:(null):83
Google Drive:(null):73
Copy:(null):68
InkServer:(null):49
iTerm:(null):44
Google Drive::69
Copy::66
Dropbox::63
Creative Cloud::57
Spotlight::41
SystemUIServer::33
SystemUIServer:(null):36
SystemUIServer::31
Window Server:Menubar:3
Dock:Dock:23
iTerm:2. bash:190
iTerm:1. bash:336

此代码无法做到这一点。

System Eventsprocesses 数组中,window 的 属性 id 不需要在 AppleScript 中可用,这就是为什么你得到错误。

如果应用程序有 AppleScript 字典并提供了 windows 元素,则所有 windows 都有 id 属性,但并非所有应用程序都支持 AppleScript 和默认情况下,非基于文档的应用程序不提供 windows 元素。