Cocoa 如何以编程方式将一个Terminal.app窗口移动到另一个空间?

Cocoa 如何以编程方式将一个Terminal.app窗口移动到另一个空间?,cocoa,macos,applescript,spaces,Cocoa,Macos,Applescript,Spaces,如果我打开了几个OS-X Terminal.app窗口,如何将一个终端窗口移动到另一个空间 我很乐意使用任何脚本或编程语言来实现这一点,但更喜欢AppleScript或对标准框架的调用 (注意,这只是移动应用程序的一个窗口。)在Objective-C/C中使用私有调用,非官方列出 #导入 typedef int CGSConnection; typedef int CGSWindow; extern OSStatus CGSMoveWorkspaceWindowList(常量CGS连接, CGS

如果我打开了几个OS-X Terminal.app窗口,如何将一个终端窗口移动到另一个空间

我很乐意使用任何脚本或编程语言来实现这一点,但更喜欢AppleScript或对标准框架的调用


(注意,这只是移动应用程序的一个窗口。)

在Objective-C/C中使用私有调用,非官方列出

#导入
typedef int CGSConnection;
typedef int CGSWindow;
extern OSStatus CGSMoveWorkspaceWindowList(常量CGS连接,
CGSWindow*wids,
整数计数,
工作空间);
外部CGSConnection\u CGSDefaultConnection(无效);
int main(int argc,字符**argv){
CGSConnection con=_CGSDefaultConnection();
//将2004替换为窗口编号
//有关获取此号码的详细信息,请参阅链接
//2004年恰好是我打开的一扇测试窗口
CGSWindow wids[]={2004};
//将4替换为目标空间数
CGSMoveWorkspaceWindowList(con、wids、1、4);
返回0;
}

标准警告适用于未记录的API:它们可能会被破坏。

根据cobbal的回答,移植到ruby的代码:

require 'dl';

wid = 2004

dl = DL::dlopen('/System/Library/Frameworks/ApplicationServices.framework/ApplicationServices')

_CGSDefaultConnection = dl.sym("_CGSDefaultConnection", 'I');

CGSMoveWorkspaceWindowList = dl.sym("CGSMoveWorkspaceWindowList", 'IIiII');

con = _CGSDefaultConnection.call();

CGSMoveWorkspaceWindowList.call(con[0], wid, 1, 4);

嗨,你做到了吗????我也在尝试这样做,遗憾的是,没有-如果我真的找到办法,我会更新这个问题。请注意,在64位,int现在是long'sCan。有人给出一些关于如何实际实现这一点的基本说明/步骤吗?这仍然是2015年将窗口移动到另一个工作区的推荐方式吗?在64位,将“I”->“L”和“iiii”更改为“lll”我尝试使用这个ruby脚本,但得到一条错误消息,dl.sym只接受一个参数。我正在运行MacOSX10.6.6(64位)。我应该如何执行您的ruby脚本?我不应该简单地创建一个包含代码的文件,然后运行ruby myfile吗?非常感谢您的帮助。请确保您使用的是/usr/bin/ruby,而不是更新的:$/usr/bin/ruby-v ruby 1.8.7(2009-06-12 patchlevel 174)[universal-darwin10.0]谢谢:)事实上,我使用的是ruby 1.9.2。它在ruby 1.8.7中工作。是否有可能改变它,使其在1.9.2中工作?这绝对是壮观的!你能把我们链接到ruby FFI的文档吗?我想看看参数的类型并返回ie:
IIiII
我想知道它们是什么。我正在将其转换为js ctypes。
require 'dl';

wid = 2004

dl = DL::dlopen('/System/Library/Frameworks/ApplicationServices.framework/ApplicationServices')

_CGSDefaultConnection = dl.sym("_CGSDefaultConnection", 'I');

CGSMoveWorkspaceWindowList = dl.sym("CGSMoveWorkspaceWindowList", 'IIiII');

con = _CGSDefaultConnection.call();

CGSMoveWorkspaceWindowList.call(con[0], wid, 1, 4);