カテゴリー: Development

  • Mozilla Firefoxノススメ

    デスクトップ、モバイル、エンタープライズ用 Firefox をダウンロード – Mozilla
    https://www.mozilla.org/ja/firefox

    Google Trends

    2004-現在

    昔はすごかった?

    現在のブラウザのシェアを見るとChrome一択だけど、最近複数画面/複数タブでピクチャーインピクチャー機能を使用するためにFirefoxをインストールした。

    Chromeでも拡張機能をインストールすればピクチャーインピクチャー機能を使用できるけれどマルチウインドウには対応していない。

    Picture-in-Picture Extension (by Google)

    https://chromewebstore.google.com/detail/picture-in-picture-extens/hkgfoiooedgoejojocmhlaklaeopbecg

    Support multiple window picture-in-picture #19

    https://github.com/GoogleChromeLabs/picture-in-picture-chrome-extension/issues/19

    マルチウインドウに対応するには大きな改修が必要らしい。データフォルダを用意して起動時に指定してやれば複数画面で使用できるみたいなことが書かれている?

    Firefox のピクチャーインピクチャーについて

    Firefox ならマルチウインドウで使用できる。

    https://support.mozilla.org/ja/kb/about-picture-picture-firefox

    動画にレイヤーが重ねられていてアクセサリーなどが配置されている場合は、ピクチャーインピクチャーのボタンが押せないので、Ctrl + Shift + ] キーのキーボードショートカットを使用している。

    追記:アドレスバーにもアイコンが用意されている。

    Firefox のダメなところについて

    アドレスバーでのサイト内検索機能が使いづらい。ブックマークでタグを設定してURLに「%s」を埋め込んでやれば検索できそうではあるけどChromeのアドレスバー/オムニバーの方がいい感じ。

    Firefoxでも過去の機能を復活させればショートカット+tab/spaceでサイト内検索できる模様。

    How do I add a custom search engine to Firefox desktop?

    https://stackoverflow.com/questions/77219507/how-do-i-add-a-custom-search-engine-to-firefox-desktop

    Re-enable a feature from the past

    1. Type in about:config in the address bar. Accept all the scary warnings.
    2. Search for browser.urlbar.update2.engineAliasRefresh.
    3. Press the + (on the right hand side).
    4. Now when you go to Settings > Search, there should be an Add button under the box which lists the various search engines available.
    5. Don’t let this post get popular, otherwise this method will also be deprecated to make Firefox better than ever!
    検索エンジン名別名URL
    Amazon Prime Videopvhttps://www.amazon.co.jp/s?k=%s&i=instant-video
    Netflixnfhttps://www.netflix.com/search?q=%s
    YouTubeythttps://www.youtube.com/results?search_query=%s
    Wikipediawphttps://ja.wikipedia.org/w/index.php?search=%s

    とりあえず4つ登録した。

    あとは、Firefoxは標準機能でフォントの指定を強制できるのはいいけどレンダリング結果が汚い。フォントがにじむの何とかならないのか調査中…

    Firefox Color

    Chromeの画面なのかFirefoxの画面なのかぱっと見で区別できないので、ブラウザの「テーマ」を初めて設定してみた。

    https://color.firefox.com/

    しばらくオレンジ色で使ってみる。

    フォクすけ

    https://ja.wikipedia.org/wiki/フォクすけ

    フォクすけ、ぐぐっても古い情報しかヒットしないですね… 終わったんですね。

    ブラウザ戦争

    https://ja.wikipedia.org/wiki/ブラウザ戦争

    ブラウザ戦争は死語ですか?そうですかー

  • How to unregister all installed service workers in Chrome

    https://www.stefanjudis.com/snippets/how-to-unregister-all-installed-service-workers-in-chrome

    サービスワーカー API

    サービスワーカーは、基本的にウェブアプリケーション、ブラウザー、そして(もし繋がっていれば)ネットワークの間に介在するプロキシサーバーのように振る舞います。これは、よりよいオフラインの操作性を可能にするように意図されており、ネットワークのリクエストに介在してネットワークの使用可否の状況に基づいて適切な対応を取ったり、サーバー上にある資産を更新したりします。また、プッシュ通知やバックグラウンド同期の API 群へのアクセスもできるようになります。

    https://developer.mozilla.org/ja/docs/Web/API/Service_Worker_API

    よりよいオフラインの操作性?そんなのはいらん。

    やったこと

    1. Chromeで以下のページを開く
      chrome://serviceworker-internals/
      →登録されているサービスワーカーが表示される
    2. 「F12」キーを押下してディベロッパーツールを開く
    3. ディベロッパーツールのコンソールで以下を実行する
      $$('.unregister').forEach(b => b.click())
      →サービスワーカーが削除される

    補足

    他のタブで開いているサイトや使っている拡張機能のサービスワーカーは削除されない。

    たまにゴミ掃除したくなるけどサービスワーカーを削除しても体感できるようなパフォーマンス改善が見込めるわけではないので悪しからずご了承くださいませ…

  • ダークモード

    素人で悪いか。

    タスクビュー

    機能追加

    • ダークモードの判定を追加
    • ダークモード用のタスクトレイアイコンを追加

    作ったもの

    taskview_ext_20240721.zip

    キーのリマッピング

    機能追加

    • ダークモードの判定を追加
    • タスクトレイアイコンを変更

    仕様変更

    • Windows 11以外は動作確認していないため、OSの判定処理は削除。
    • Alt + 数字キー押下後、初回のAlt + 矢印キーで画面サイズが変更されなかったので修正。
      • Alt + 1押下後、Alt + Leftキー
      • Alt + 2押下後、Alt + Up/Downキー
      • Alt + 3押下後、Alt + Rightキー

    Alt + 矢印キー押下後のAlt + 数字キーも同様。

    機能追加

    • Alt + q,a,w,sキーの押下後にAlt + 矢印キーで画面移動を追加(実用的な機能ではない)

    作ったもの

    keyremap_20240721.zip

    余談

    AutoHotkeyのデフォルトのアイコンが「H」アイコンなので、KeyRemapのアイコンを「R」にしました。

    以下をコメントアウトすると表示されます。

    ; 仮想デスクトップ移動
    #Include "*i C:\tool\taskview\taskview_ext.ahk"

    「R」シールに似ていますが、私は蓮舫さんの支持者ではありません。負けたら黙ろうなー どあほうが・・・w

    https://www.google.com/search?q=蓮舫%20R&tbm=isch

  • キーのリマッピング

    少し修正したので貼っておこー 

    仕様変更

    • 「ROTATION_LENGTH」のユーザー定義を削除して各配列長でローテーションするように変更
    • 初期値の変更

    機能追加

    • 画面移動のホットキー再押下時にShiftキーで戻る
    • Alt + 矢印キーでの画面移動を追加(Alt + 1,2,3と同様)

    作ったもの

    keyremap_20240630.zip

  • Maker’s Mark

    https://猫猫猫.tokyo/?p=1353

    タスクビュー、バグってるやん。新規に起動したときにデフォルトアイコンが表示される。スクリプトをリロードして動作確認した場合は問題なかったのに、新規で起動された場合はデフォルトのアイコンが…w これは酷い。だめだこりゃー

    バグ修正したので貼っておく。

    taskview_ext_20240623.zip

    キーのリマッピングの方は、「Alt」+「1」キーと「Alt}+「3」キーの2回目の押下で動作が違う。画面が大きくなる動作で統一した方がいいのか悪いのか、この辺りは好みの問題かもしれないけど、自分で作成すると細かいところまで自由に直せるのはいいよねえ。作りながら直しながら使えるものができるといいなぁとは思う。明日直せるかな。

    画面の移動まわりの処理を修正したので貼っておく。

    keyremap_20240623.zip

    機能追加

    ; Home/End
    !Left:: Send "{Home}"
    !Right:: Send "{End}"
    !+Left:: Send "+{Home}"
    !+Right:: Send "+{End}"
    
    ; 画面移動(上/下)
    !e:: setWindowPosition("e")
    !d:: setWindowPosition("d")
    • 上記のホットキーを追加
    • すべての画面移動についてホットキーの再押下で画面サイズを変更
    • 画面サイズの変更でユーザー定義を可能にした↓

    ユーザー定義

    初期値ではホットキーを3回押下すると元のサイズに戻ります。

    ; 画面移動ホットキーの再押下(1サイクル)
    ; 1以上の整数を指定する
    ROTATION_LENGTH := 3
    
    ; 以下の配列の先頭から「ROTATION_LENGTH」個まで使用している
    ; 再押下ごとの画面サイズを百分率で指定する
    ; Alt + [1]
    LEFT_WIDTH := [0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
    ; Alt + [2]
    CENTER_WIDTH := [0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
    ; Alt + [3]
    RIGHT_WIDTH := [0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
    ; Alt + [qwe]
    UPPER_HEIGHT := [0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
    ; Alt + [asd]
    LOWER_HEIGHT := [0.5, 0.6, 0.7, 0.8, 0.9, 1.0]

    スクリプトを編集した場合は、スクリプトの再起動が必要です。

    例1:

    ホットキーの再押下で画面サイズを変更したくない場合

    ROTATION_LENGTH := 1

    1を指定すると配列の1つ目の値だけが使用されます。0.5 = 50% の大きさで画面の幅や高さが設定されます。

    例2:

    少しずつ画面サイズを大きくする場合

    ROTATION_LENGTH := 6

    ホットキーを6回押下すると元のサイズに戻ります。

    例3:

    少しずつ画面サイズを大きくする場合2

    ; ----------------------------------------
    ; User define
    ; ----------------------------------------
    
    ;
    ; ・・・ もともとのやつ ・・・
    ;
    
    ROTATION_LENGTH := 12
    LEFT_WIDTH := [0.4, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0]
    CENTER_WIDTH := [0.4, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0]
    RIGHT_WIDTH := [0.4, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0]
    UPPER_HEIGHT := [0.4, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0]
    LOWER_HEIGHT := [0.4, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0]
    
    ; ----------------------------------------
    ; define
    ; ----------------------------------------

    配列の要素数や要素の値は可変です。ROTATION_LENGTHで指定した要素数だけ値を定義してください。

    変数は再代入して上書きできますので上記のようにもとものコードの下に変更した内容を追記できます。もともとのコードはコピペ時のテンプレとして使用してください。

  • Maker’s Mark

    今日はこれ。おいしーーーー! 

    メモ書き。

    タスクビュー、バグってるやん。新規に起動したときにデフォルトアイコンが表示される。スクリプトをリロードして動作確認した場合は問題なかったのに、新規で起動された場合はデフォルトのアイコンが…w これは酷い。だめだこりゃー

    キーのリマッピングの方は、「Alt」+「1」キーと「Alt}+「3」キーの2回目の押下で動作が違う。画面が大きくなる動作で統一した方がいいのか悪いのか、この辺りは好みの問題かもしれないけど、自分で作成すると細かいところまで自由に直せるのはいいよねえ。作りながら直しながら使えるものができるといいなぁとは思う。明日直せるかな。

    あとは不定期のblogの投稿よりは、1か所にまとめて記事があった方がいいよな。AutohotKey V2をインストールしてくださいみたいなところからちゃんと整理して使えるようにしたいけどしばらくはこのままかもしれない。

    パブリックドメイン

    本サイトで公開する情報は、すべてパブリックドメインに供与いたします。自由に改変していただいて構いません。著作権も含めてすべての権利を放棄いたします。

    的なことよりURLのドメインどうするかの方が悩ましい。

    https://kozawa.tokyo

    https://猫猫猫.tokyo

    実名ドメインに戻す?サブドメインとして混ぜる?

    https://猫猫猫.kozawa.tokyo

    猫猫猫さん、著名人でいたんだよなぁ。ドメイン取得前に気づくべきだった… どうしようかな。

  • タスクビュー

    少し修正したので貼っておこー

    機能追加

    • タスクトレイのアイコンに現在の仮想デスクトップの番号を表示
    • タスクトレイのアイコンのメニューからデスクトップを移動

    作ったもの

    taskview_ext_20240620.zip

    「タスクビュー」のソースファイル

    #Requires AutoHotkey v2.0+
    #SingleInstance Force
    
    ; ----------------------------------------
    ; define
    ; ----------------------------------------
    
    PREV := "Prev"
    NEXT := "Next"
    OK := True
    NG := False
    BASE_DIR := "C:\tool\taskview\"
    VDA_PATH := BASE_DIR . "VirtualDesktopAccessor.dll"
    TRAYICON_PATH := BASE_DIR . "images\"
    hVirtualDesktopAccessor := DllCall("LoadLibrary", "Str", VDA_PATH, "Ptr")
    GetDesktopCountProc := DllCall("GetProcAddress", "Ptr", hVirtualDesktopAccessor, "AStr", "GetDesktopCount", "Ptr")
    GoToDesktopNumberProc := DllCall("GetProcAddress", "Ptr", hVirtualDesktopAccessor, "AStr", "GoToDesktopNumber", "Ptr")
    GetCurrentDesktopNumberProc := DllCall("GetProcAddress", "Ptr", hVirtualDesktopAccessor, "AStr", "GetCurrentDesktopNumber", "Ptr")
    MoveWindowToDesktopNumberProc := DllCall("GetProcAddress", "Ptr", hVirtualDesktopAccessor, "AStr", "MoveWindowToDesktopNumber", "Ptr")
    
    ; ----------------------------------------
    ; helper function
    ; ----------------------------------------
    
    GetDesktopCount() {
        count := DllCall(GetDesktopCountProc, "Int")
        return count
    }
    
    GoToDesktopNumber(number) {
        if (number > GetDesktopCount())
            return
        ; Win + 左右キーのアニメーションに操作感を合わせるため、
        ; 移動前後に0.5秒の待ち時間を設定している(機能的には不要)
        Sleep 500
        DllCall(GoToDesktopNumberProc, "Int", number - 1)
        Sleep 500
    }
    
    GetCurrentDesktopNumber() {
        number := DllCall(GetCurrentDesktopNumberProc, "Int")
        number++ ; デスクトップ番号を1オリジンで指定するため + 1
        return number
    }
    
    MoveWindowToDesktopNumber(number) {
        WinWaitActive WinExist("A")
        retry := 0
        Loop
            try {
                activeHwnd := WinGetID("A")
                number-- ; dllには0オリジンで渡すため - 1
                DllCall(MoveWindowToDesktopNumberProc, "Ptr", activeHwnd, "Int", number, "Int")
                result := OK
                break
            } catch {
                Sleep 250
                result := NG
                retry++
            }
        until retry == 10
    
        return result
    }
    
    moveWindow(desktop) {
        current := GetCurrentDesktopNumber()
        max := GetDesktopCount()
        if (desktop == PREV) {
            if (current == 1) {
                result := MoveWindowToDesktopNumber(max)
            } else {
                result := MoveWindowToDesktopNumber(current - 1)
            }
        } else if (desktop == NEXT) {
            if (current == max) {
                result := MoveWindowToDesktopNumber(1)
            } else {
                result := MoveWindowToDesktopNumber(current + 1)
            }
        } else {
            result := MoveWindowToDesktopNumber(desktop)
        }
        return result
    }
    
    moveDesktop(desktop) {
        current := GetCurrentDesktopNumber()
        max := GetDesktopCount()
        if (desktop == PREV) {
            if (current == 1) {
                GoToDesktopNumber(max)
            } else {
                Send "^#{Left}"
            }
            KeyWait "Left"
        } else if (desktop == NEXT) {
            if (current == max) {
                GoToDesktopNumber(1)
            } else {
                Send "^#{Right}"
            }
            KeyWait "Right"
        } else {
            GoToDesktopNumber(desktop)
        }
    }
    
    moveWindowMoveDesktop(desktop) {
        result := moveWindow(desktop)
        if (result == OK)
            moveDesktop(desktop)
    }
    
    ; ----------------------------------------
    ; tasktray
    ; ----------------------------------------
    
    ; メニュー追加
    A_TrayMenu.Add()
    num := 1
    Loop GetDesktopCount() {
        A_TrayMenu.Add("desktop " . num, MenuHandler)
        num++
    }
    MenuHandler(itemName, itemPos, myMenu) {
        itemCount := DllCall("GetMenuItemCount", "ptr", A_TrayMenu.Handle)
        startNum := itemCount - GetDesktopCount()
        newNum := itemPos - startNum
        moveDesktop(newNum)
    }
    
    ; タスクトレイ更新
    iconNum := 1
    Loop {
        currNum := GetCurrentDesktopNumber()
        if (iconNum != currNum) {
            try {
                ; アイコン
                TraySetIcon(TRAYICON_PATH . currNum . ".png")
                ; メニュー
                num := 1
                Loop GetDesktopCount() {
                    A_TrayMenu.Uncheck("desktop " . num)
                    num++
                }
                A_TrayMenu.Check("desktop " . currNum)
            }
            iconNum := currNum
        }
        Sleep 1000
    }
    
    ; ----------------------------------------
    ; main
    ; ----------------------------------------
    
    ; アクティブ画面移動
    ^+Left:: moveWindow(PREV)
    ^+Right:: moveWindow(NEXT)
    ^+F1:: moveWindow(1)
    ^+F2:: moveWindow(2)
    ^+F3:: moveWindow(3)
    ^+F4:: moveWindow(4)
    ^+F5:: moveWindow(5)
    ^+F6:: moveWindow(6)
    
    ; デスクトップ移動
    ^#Left:: moveDesktop(PREV)
    ^#Right:: moveDesktop(NEXT)
    ^#F1:: moveDesktop(1)
    ^#F2:: moveDesktop(2)
    ^#F3:: moveDesktop(3)
    ^#F4:: moveDesktop(4)
    ^#F5:: moveDesktop(5)
    ^#F6:: moveDesktop(6)
    
    ; アクティブ画面/デスクトップ移動
    ^#+Left:: moveWindowMoveDesktop(PREV)
    ^#+Right:: moveWindowMoveDesktop(NEXT)
    ^#+F1:: moveWindowMoveDesktop(1)
    ^#+F2:: moveWindowMoveDesktop(2)
    ^#+F3:: moveWindowMoveDesktop(3)
    ^#+F4:: moveWindowMoveDesktop(4)
    ^#+F5:: moveWindowMoveDesktop(5)
    ^#+F6:: moveWindowMoveDesktop(6)
  • キーのリマッピング

    少し修正したので貼っておこー

    バグ修正

    • デスクトップのアイコンを移動させてしまう動作を修正
    • 最大化した画面を移動する場合、最大化を解除してから移動するように変更

    機能追加

    • 「Alt」+「1」「3」の再押下で画面サイズを変更
    • マルチモニターに対応(コードは入れたけどテストは未実施)

    その他

    • タスクトレイのアイコンを1つにまとめるため、以下のスクリプトが存在していたら読み込むように修正。
      「C:\tool\taskview\taskview_ext.ahk」

    作ったもの

    keyremap_20240620.zip

    「キーのリマッピング」のソースファイル

    https://ahkscript.github.io/ja/docs/v2/misc/Remap.htm

    #Requires AutoHotkey v2.0+
    #SingleInstance Force
    
    ; ----------------------------------------
    ; define
    ; ----------------------------------------
    ; デスクトップ情報
    DESKTOP_CLASS := "ahk_class Progman"
    DESKTOP_CLASS2 := "ahk_class WorkerW"
    DESKTOP_EXE := "ahk_exe explorer.exe"
    ; Alt「1」/「3」
    ROTATION_WIDTH_MINI := 0.3
    ROTATION_WIDTH_MAX := 1 - ROTATION_WIDTH_MINI
    ; Alt「2」
    CENTER_WIDTH_SIZE := 0.8
    CENTER_WIDTH_START := (1 - CENTER_WIDTH_SIZE) / 2
    
    ; グローバル変数
    previousKey := ""
    
    ; ----------------------------------------
    ; helper function
    ; ----------------------------------------
    
    ; OS情報取得
    getWinOSVersion()
    {
    	osVersion := StrSplit(A_OSVersion, ".")
    	major := osVersion[1]
    	minor := osVersion[2]
    	build := osVersion[3]
    	if (major == "10")
    		if (minor == "0")
    			if (build >= "20000")
    				return 11
    	return 10
    }
    
    ; アクティブ画面のモニター番号取得
    getMonitorNumberOfActiveWindow()
    {
    	WinGetPos(&x, &y, , , "A")
    	monitorCount := MonitorGetCount()
    	Loop monitorCount {
    		MonitorGet(A_Index, &left, &top, &right, &bottom)
    		if (x >= left
    			and x <= right
    			and y >= top
    			and y <= bottom) {
    			return A_Index
    		}
    	}
    	return 1
    }
    
    ; ディスプレイ情報取得
    getDisplayInfo(monitorNum, &x, &y, &width, &height)
    {
    	if (monitorNum.Length > 0) {
    		displayNum := monitorNum[1]
    	} else {
    		displayNum := getMonitorNumberOfActiveWindow()
    	}
    	MonitorGetWorkArea(displayNum, &left, &top, &right, &bottom)
    	x := left
    	y := top
    	width := right - left
    	height := bottom - top
    }
    
    ; 画面位置取得
    getWindowPosition(monitorNum, windowPosition, &x, &y, &width, &height)
    {
    	; ディスプレイ情報取得
    	getDisplayInfo(monitorNum, &x, &y, &width, &height)
    
    	; 画面サイズ補正
    	; 画面の左,右,下に隙間が空くので補正する。
    	; ウインドスタイル「WS_SYSMENU」が設定されていない画面は補正なし。(例:VSCode)
    	edge := 0
    	if (getWinOSVersion() == 11) {
    		style := WinGetStyle("A")
    		if (style & 0x00080000) { ; WS_SYSMENU
    			edge := 7 ; px
    		}
    	}
    
    	; 画面位置計算
    	if (windowPosition == "1min") {
    		x := x - edge
    		y := y
    		width := width * ROTATION_WIDTH_MINI + edge * 2
    		height := height + edge
    	}
    	if (windowPosition == 1) {
    		x := x - edge
    		y := y
    		width := width / 2 + edge * 2
    		height := height + edge
    	}
    	if (windowPosition == "1max") {
    		x := x - edge
    		y := y
    		width := width * ROTATION_WIDTH_MAX + edge * 2
    		height := height + edge
    	}
    	if (windowPosition == 2) {
    		x := width * CENTER_WIDTH_START
    		y := y
    		width := width * CENTER_WIDTH_SIZE + edge * 2
    		height := height + edge
    	}
    	if (windowPosition == "3min") {
    		x := width * ROTATION_WIDTH_MINI - edge
    		y := y
    		width := width * ROTATION_WIDTH_MAX + edge * 2
    		height := height + edge
    	}
    	if (windowPosition == 3) {
    		x := width / 2 - edge
    		y := y
    		width := width / 2 + edge * 2
    		height := height + edge
    	}
    	if (windowPosition == "3max") {
    		x := width * ROTATION_WIDTH_MAX - edge
    		y := y
    		width := width * ROTATION_WIDTH_MINI + edge * 2
    		height := height + edge
    	}
    	if (windowPosition == "q") {
    		x := x - edge
    		y := y
    		width := width / 2 + edge * 2
    		height := height / 2 + edge
    	}
    	if (windowPosition == "a") {
    		x := x - edge
    		y := height / 2 + y
    		width := width / 2 + edge * 2
    		height := height / 2 + edge
    	}
    	if (windowPosition == "w") {
    		x := width / 2 - edge
    		y := y
    		width := width / 2 + edge * 2
    		height := height / 2 + edge
    	}
    	if (windowPosition == "s") {
    		x := width / 2 - edge
    		y := height / 2 + y
    		width := width / 2 + edge * 2
    		height := height / 2 + edge
    	}
    	OutputDebug("x=" x " y=" y " width=" width " height=" height " windowPosition=" windowPosition)
    }
    
    ; 画面位置設定
    setWindowPosition(windowPosition, monitorNum*) {
    	global previousKey
    	try {
    		; デスクトップのアイコンが移動してしまうのでガード
    		activeHwnd := WinGetID("A")
    		GroupAdd("Desktop", DESKTOP_CLASS " " DESKTOP_EXE)
    		GroupAdd("Desktop", DESKTOP_CLASS2 " " DESKTOP_EXE)
    		desktopHwnd := WinGetID("ahk_group Desktop")
    		if (activeHwnd == desktopHwnd)
    			return
    
    		; 画面の最大化を解除
    		if (WinGetMinMax(activeHwnd) == 1)
    			WinRestore(activeHwnd)
    
    		; 「1」再押下で画面幅を変更
    		if (windowPosition == 1) {
    			if (previousKey == 1) {
    				windowPosition := "1max"
    			} else if (previousKey == "1max") {
    				windowPosition := "1min"
    			} else if (previousKey == "1min") {
    				windowPosition := 1
    			}
    		}
    		; 「3」再押下で画面幅を変更
    		if (windowPosition == 3) {
    			if (previousKey == 3) {
    				windowPosition := "3max"
    			} else if (previousKey == "3max") {
    				windowPosition := "3min"
    			} else if (previousKey == "3min") {
    				windowPosition := 3
    			}
    		}
    
    		; 移動位置取得
    		getWindowPosition(monitorNum, windowPosition, &x, &y, &width, &height)
    
    		; 画面移動
    		WinMove(x, y, width, height, activeHwnd)
    
    		; 前回の移動先保存
    		previousKey := windowPosition
    	}
    }
    
    ; ----------------------------------------
    ; main
    ; ----------------------------------------
    
    ; 矢印キー × 5
    ^Up:: Send "{UP 5}"
    ^Down:: Send "{Down 5}"
    ^Left:: Send "{Left 5}"
    ^Right:: Send "{Right 5}"
    
    ; 上下左右
    ^*i:: Send "{UP}"
    ^*k:: Send "{Down}"
    ^*j:: Send "{Left}"
    ^*l:: Send "{Right}"
    ^*u:: Send "{Home}"
    ^*o:: Send "{End}"
    
    ; 削除
    ^*h:: Send "{BS}"
    
    ; 画面移動(左/中央/右)
    !1:: setWindowPosition("1")
    !2:: setWindowPosition("2")
    !3:: setWindowPosition("3")
    
    ; 画面移動(左上/左下/右上/右下)
    !q:: setWindowPosition("q")
    !a:: setWindowPosition("a")
    !w:: setWindowPosition("w")
    !s:: setWindowPosition("s")
    
    ; 音量調整
    ^F10:: Send "{VOLUME_MUTE}"
    ^F11:: Send "{VOLUME_DOWN}"
    ^F12:: Send "{VOLUME_UP}"
    
    ; 仮想デスクトップ
    #Include "*i C:\tool\taskview\taskview_ext.ahk"

    Ctrl + 矢印キー:矢印キー5回連打
    Ctrl + iキー :上キー
    Ctrl + kキー :下キー
    Ctrl + jキー :左キー
    Ctrl + lキー :右キー
    Ctrl + uキー :Homeキー
    Ctrl + oキー :Endキー
    Ctrl + hキー :BackSpace
    Alt + 1キー :アクティブ画面左寄せ*
    Alt + 2キー :アクティブ画面中央寄せ
    Alt + 3キー :アクティブ画面右寄せ*
    Alt + qキー :アクティブ画面左上寄せ
    Alt + aキー :アクティブ画面左下寄せ
    Alt + wキー :アクティブ画面右上寄せ
    Alt + sキー :アクティブ画面右下寄せ
    Ctrl + F10 :音量ミュート
    Ctrl + F11 :音量Down
    Ctrl + F12 :音量UP

    *:機能追加

    アクティブ画面の移動先モニターの指定

    setWindowPosition関数の第2引数にモニター番号を指定します。

    例:

    !1:: setWindowPosition("1", 1)
    !2:: setWindowPosition("2", 1)
    !3:: setWindowPosition("3", 1)
    !4:: setWindowPosition("1", 2)
    !5:: setWindowPosition("2", 2)
    !6:: setWindowPosition("3", 2)

    上記の例では、「Alt」+「1~3」キーでプライマリモニタに、「Alt」+「4~6」キーでセカンダリモニターに、画面移動します。(動作未確認)

    例:

    !1:: setWindowPosition("1")
    !2:: setWindowPosition("2")
    !3:: setWindowPosition("3")

    省略時は、アクティブ画面が存在しているモニターで画面移動します。

    ! = Alt
    ^ = Ctrl
    + = Shift
    # = Win

    …φ(. . )メモメモ

  • マウスジェスチャー/タスクビュー

    ひと工夫したので貼っておこー

    やりたいこと

    マウスジェスチャーで仮想デスクトップを切り替えたい。

    やったこと

    1. 以下のサイトからMouseGestureL.ahkをダウンロードします。

    MouseGestureL.ahk
    https://hp.vector.co.jp/authors/VA018351/mglahk.html

    「MouseGestureL.ahk Ver. 1.40 (2022/06/22)」リンクから「MGLahk140.zip」をダウンロードする。

    2. ダウンロードした「MGLahk140.zip」を展開し、以下に格納します。

    C:\tool\MGLahk140
    └─Setup.vbs
    └─ ・・・

    ※格納場所任意。

    3. 「Setup.vbs」を実行し、「MouseGestureL.exe」を生成します。

    C:\tool\MGLahk140
    └─Setup.vbs
    └─ ・・・
    └─ MouseGestureL.exe

    4. 生成した「MouseGestureL.exe」を実行します。
    →タスクトレイに「MouseGestureL.ahk」が常駐します。

    5. 「MouseGestureL.ahk」を右クリックし、「設定」を選択します。

    6. マウスジェスチャーに「タスクビュー」のキーボード操作を割り当てます。

    例:RB←

    アクションスクリプト

    ;左デスクトップに移動
    SendLevel 1
    ctrl := GetKeyState("Ctrl")
    shift := GetKeyState("Shift")
    win := GetKeyState("LWin")
    if (ctrl and shift and win) {
        Send,^+#{Left}
    } else if (ctrl and shift) {
        Send,^+{Left}
    } else if (ctrl and win) {
        Send,^#{Left}
    } else {
        Send,^#{Right}
    }

    RB← + Ctrl + Shift + Win:アクティブ画面を左デスクトップに移動して、左デスクトップに移動
    RB← + Ctrl + Shift:アクティブ画面を左デスクトップに移動
    RB← + Ctrl + Win:左デスクトップに移動

    RB←:右デスクトップに移動

    例:RB→

    アクションスクリプト

    ;右デスクトップに移動
    SendLevel 1
    ctrl := GetKeyState("Ctrl")
    shift := GetKeyState("Shift")
    win := GetKeyState("LWin")
    if (ctrl and shift and win) {
        Send,^+#{Right}
    } else if (ctrl and shift) {
        Send,^+{Right}
    } else if (ctrl and win) {
        Send,^#{Right}
    } else {
        Send,^#{Left}
    }

    RB→ + Ctrl + Shift + Win:アクティブ画面を右デスクトップに移動して、右デスクトップに移動
    RB→ + Ctrl + Shift:アクティブ画面を右デスクトップに移動
    RB→ + Ctrl + Win:右デスクトップに移動

    RB→:左デスクトップに移動

    注意事項

    上記のアクションスクリプトをそのままコピペする場合は読み飛ばしてください。

    MouseGestureL.ahk も AutoHotkey で作成されています。

    AutoHotkey 1.0:ASCII版
    AutoHotkey 1.1:Unicode版
    AutoHotkey 2.0:下位互換なし、レガシーシンタックス廃止版。

    MouseGestureL.ahk は、AutoHotkey 1.1 で、「タスクビュー」は、AutoHotkey 2.0 で実行されています。

    タスクビュー
    https://猫猫猫.tokyo/?p=1262

    通常、AutoHotkeyで生成したキーストロークは、AutoHotkeyでは処理されません。AutoHotkeyでAutoHotkeyのホットキーをトリガーするために、アクションスクリプトでSendする前にSendLevelの指定が必要となります。

    SendLevel 1

    SendLevel
    https://ahkscript.github.io/ja/docs/v2/lib/SendLevel.htm

    下位互換はないですが、SendLevel、InputLevelまわりは互換ありです。

    7. 「軌跡・ログ」タブで「ジェスチャーの軌跡を表示する」にチェックする。(任意)

    8. 「その他」タブで「スタートアップに登録」する。管理者権限は不要です。(任意)

    9. 「OK」ボタンをクリックする。