如何从applescript获取windowid

时间:2015-09-29 10:11:36

标签: applescript

我正在尝试获取每个窗口的窗口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

上面的代码返回

  

错误“系统事件出错:无法获取每个进程的每个窗口的第1项的ID。”从每个过程的每个窗口的项目1的id开始编号-1728

如何获取每个窗口的窗口ID?

2 个答案:

答案 0 :(得分:1)

我为你写了一个Objective-C程序来获取窗口所有者,窗口名称和窗口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

答案 1 :(得分:1)

此代码无法做到这一点。

processes数组System Events中,AppleScript中不需要窗口的属性id,这就是您收到错误的原因。< / p>

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