gpt4 book ai didi

objective-c - 控制 OSX 窗口

转载 作者:太空狗 更新时间:2023-10-30 03:22:00 25 4
gpt4 key购买 nike

我正在尝试从我的应用程序控制外国 OSX 应用程序的窗口。我想要到1.移动屏幕上的窗口2.调整屏幕上的窗口大小3.更改应用程序的当前事件窗口4. 获取当前事件窗口。

(我想通过 ObjC/C/C++ api 来做到这一点)。

考虑到我拥有要控制的窗口的 CGWindowID,我应该寻找哪些 API 调用?也就是说,我希望找到具有类似签名的函数:MoveWindow(CGWindowID winId, int x, int y), ResizeWindow(CGWindowID winId, int width, int height)Activatewindow(CGWindowID winId)CGWindowID GetCurrentlyActivatedWindow()

对于 3,我已经在使用 SetFrontProcess 将一个进程拉到最前面,但是如果它有多个进程,这不允许我选择进程的特定窗口。

最佳答案

实现此目的的一种方法确实是使用可访问性 API。

我正在开发的一个应用程序就是这样做的,以获取前窗、前窗的文档路径和许多其他属性。

我这样做的方式是通过 AppleScript。它有时可能很笨拙,但似乎相当可靠。我用 AppScript从我的 Cocoa 应用程序中发送 AppleScript。它是线程安全的,并且比其他替代方案(Scripting Bridge 或 NSAppleScript)更稳定。

困难的一点是在 AppleScript 中使用它的窗口 ID 来识别窗口 - AppleScript 似乎没有与 CGWindowID 相匹配的窗口 ID 属性。但是,您可以使用 AppleScript 获得任何您想要的窗口。

  1. 将最前面的窗口移到 100, 100

    tell application "System Events"
    set theprocess to the first process whose frontmost is true
    set thewindow to the value of attribute "AXFocusedWindow" of theprocess
    set position of thewindow to {100, 100}
    end tell
  2. 将最前面的窗口调整为 200、300

    tell application "System Events"
    set theprocess to the first process whose frontmost is true
    set thewindow to the value of attribute "AXFocusedWindow" of theprocess
    set size of thewindow to {200, 300}
    end tell
  3. 更改最前面应用程序的当前窗口

    tell application "System Events"
    set theprocess to the first process whose frontmost is true
    set thewindow to the value of attribute "AXFocusedWindow" of theprocess
    set size of thewindow to {200, 300}
    windows of theprocess
    -- Code to get ID of window you want to activate
    tell window 2 of theprocess -- assuming it's window 2
    perform action "AXRaise"
    end tell
    end tell
  4. 事件的窗口

    tell application "System Events"
    set theprocess to the first process whose frontmost is true
    set thewindow to the value of attribute "AXFocusedWindow" of theprocess
    end tell

AppScript 有一个可用的应用程序,名为 ASTranslate这会将此 AppleScript 转换为调用 AppScript 中相关命令的 Objective C 代码。

有关如何获取窗口大小和边界的更多信息(据我所知,这些是只读的)请参阅 Son of Grab示例应用程序。

关于objective-c - 控制 OSX 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1730859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com