【问题标题】:How can I programmatically move one Terminal.app window to another space?如何以编程方式将一个 Terminal.app 窗口移动到另一个空间?
【发布时间】:2011-01-19 12:16:30
【问题描述】:

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

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

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

【问题讨论】:

  • 嗨,你做到了吗????我也在尝试这样做
  • 很遗憾,不——如果我真的找到办法,我会更新这个问题。

标签: cocoa macos applescript spaces


【解决方案1】:

根据 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 位上,将“I”->“L”和“IiiiI”更改为“LLlLL”
  • 我尝试使用这个 ruby​​ 脚本,但我收到一条错误消息,指出 dl.sym 只接受一个参数。我正在运行 Mac OS X 10.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。它适用于红宝石 1.8.7。是否可以更改它以使其在 1.9.2 中工作?
  • 这绝对是壮观!您能否将我们链接到有关 ruby​​ FFI 的文档,我有兴趣查看参数类型并返回,即:IIiII 我想知道它们是什么。我正在将其转换为 js-ctypes。
【解决方案2】:

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

#import <Foundation/Foundation.h>

typedef int CGSConnection;
typedef int CGSWindow;

extern OSStatus CGSMoveWorkspaceWindowList(const CGSConnection connection,
                                       CGSWindow *wids,
                                       int count,
                                       int toWorkspace);
extern CGSConnection _CGSDefaultConnection(void);


int main(int argc, char **argv) {
    CGSConnection con = _CGSDefaultConnection();

    // replace 2004 with window number
    // see link for details on obtaining this number
    // 2004 just happened to be a window I had open to test with
    CGSWindow wids[] = {2004};

    // replace 4 with number of destination space
    CGSMoveWorkspaceWindowList(con, wids, 1, 4);

    return 0;
}

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

【讨论】:

  • 注意 64 位,int 现在是 long 的
  • 任何人都可以提供一些关于如何实际实施的基本说明/步骤吗?
  • 这仍然是 2015 年将窗口移动到另一个工作区的推荐方式吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2019-12-30
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多