2025年1月1日水曜日

HammerSpoon 同一アプリで複数ウィンドウを開いている場合にそれぞれのウィンドウを制御する方法

HammerSpoon 同一アプリで複数ウィンドウを開いている場合にそれぞれのウィンドウを制御する方法

概要

アプリ名で絞り込んでからウィンドウの一覧を取得する方法もありますがプロセスとして独立してる場合にはそれだと取得できないことがあるのですべてのアプリを取得してからアプリ名でウィンドウを絞り込み操作します

環境

  • macOS 15.2
  • HammerSpoon 1.0.0

サンプルコード

hs.hotkey.bind({"cmd", "alt"}, "S", function()
    -- hs.applicatoin.find -> app:allWindows ではミューレータを検知できないのですべてのアプリを取得してからアプリ名で対象のウィンドウを絞り込む
    local activeWindows = {}
    local apps = hs.application.runningApplications()
    for _, app in ipairs(apps) do
        if app:name() == "MuMu Android Device" then
            local windows = app:allWindows()
            for i, win in ipairs(windows) do
                table.insert(activeWindows, win)
            end
        end
    end

    -- 各ウィンドウにサイズと位置を指定、左上の角が指定したX/Yの開始位置
    local width = 275
    local height = 527
    local center_device_x = 960 - (275 / 2)
    local toolbar_mergin_height = 25
    local positions = {
        -- 上段
        {x = center_device_x, y = 0, w = width, h = height},
        {x = center_device_x - width, y = 0, w = width, h = height},
        {x = center_device_x + width, y = 0, w = width, h = height},
        {x = center_device_x - (width * 2), y = 0, w = width, h = height},
        {x = center_device_x + (width * 2), y = 0, w = width, h = height},
        -- 下段
        {x = center_device_x, y = height + toolbar_mergin_height, w = width, h = height},
        {x = center_device_x - width, y = height + toolbar_mergin_height, w = width, h = height},
        {x = center_device_x + width, y = height + toolbar_mergin_height, w = width, h = height},
        {x = center_device_x - (width * 2), y = height + toolbar_mergin_height, w = width, h = height},
        {x = center_device_x + (width * 2), y = height + toolbar_mergin_height, w = width, h = height},
    }

    for i, win in ipairs(activeWindows) do
        if positions[i] then
            win:setFrame(positions[i])
        end
    end
end)

最後に

制御するウィンドウをハッシュに登録してあとからウィンドウを操作するようにしています

0 件のコメント:

コメントを投稿