• ゆりこしか勝たんか… つまらんなあー 🤔

  • 小池百合子知事の都知事選の公約について解説します

    ホリエモンが立候補すればいいのに… つまらんなあー 🤔

  • スコッチウイスキーハイボール

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

    スモーキー?おいしいかおいしくないかはあなたしだいです…

  • 👍

  • 🧱🧑‍💻

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

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

    やりたいこと

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

    やったこと

    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://kozawa.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」ボタンをクリックする。

  • タスクビュー

    書き直したやつも貼っておこー

    https://kozawa.tokyo/?p=1259

    機能追加

    Ctrl + Win + F1~F6キー:デスクトップ切り替え
    Ctrl + Shift + F1~F6キー:アクティブ画面を指定のデスクトップに移動*
    Ctrl + Shift + Win + F1~F6キー:アクティブ画面を指定のデスクトップに移動してデスクトップも移動*
    Ctrl + Win + 左右キー:デスクトップ1と6を左右キーで移動*
    Ctrl + Shift + 左右キー:アクティブ画面を隣のデスクトップに移動*
    Ctrl + Shift + Win + 左右キー:アクティブ画面を隣のデスクトップに移動してデスクトップも移動*

    *:機能追加

    もうぐちゃぐちゃ。こんなの覚えてられん。これを覚えて使おうとする人おる?環境によっては、Ctrl + Shift + 左右キーあたりは他のソフトのホットキーと被るかもしれないので人によっては使えないのだろうなぁとは分かりつつも致し方なし。

    作ったもの

    taskview_ext_20240615.zip

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

    #Requires AutoHotkey v2.0+
    #SingleInstance Force
    
    ; ----------------------------------------
    ; define
    ; ----------------------------------------
    
    PREV := "Prev"
    NEXT := "Next"
    OK := True
    NG := False
    VDA_PATH := "C:\tool\taskview\VirtualDesktopAccessor.dll"
    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)
    }
    
    ; ----------------------------------------
    ; 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)

    インストール手順

    1.「taskview_ext_20240615.zip」ファイルを展開し、C:ドライブの直下に格納します。

    C:\tool\taskview
    └─taskview_ext.ahk

    ※格納場所固定。変更する場合は、ソース内のパス「VDA_PATH := “C:\tool\taskview\VirtualDesktopAccessor.dll”」を変更する必要がある。

    2. 以下のサイトからDLLファイルをダウンロードします。

    VirtualDesktopAccessor.dll
    https://github.com/Ciantic/VirtualDesktopAccessor

    リリースページの「VirtualDesktopAccessor.dll」をダウンロードする。
    https://github.com/Ciantic/VirtualDesktopAccessor/releases

    3. ダウンロードしたDLLファイルを同じフォルダに格納します。

    C:\tool\taskview
    ├─taskview_ext.ahk
    └─VirtualDesktopAccessor.dll

    4. 「taskview_ext.ahk」を実行します。

    アンインストール

    フォルダごと削除するだけ。

    動作確認環境

    • Windows 11
    • Autohotkey V2
    • ディスプレイ:1枚だけ

    既知の問題点

    デスクトップ1と6を左右キーで移動するときにアニメーションがない。

    その他

    IVirtualDesktopManager インターフェイス (shobjidl_core.h)
    https://learn.microsoft.com/ja-jp/windows/win32/api/shobjidl_core/nn-shobjidl_core-ivirtualdesktopmanager

    • IVirtualDesktopManager::GetWindowDesktopId
      指定された最上位ウィンドウをホストしている仮想デスクトップの識別子を取得します。
    • IVirtualDesktopManager::IsWindowOnCurrentVirtualDesktop
      指定されたウィンドウが現在アクティブな仮想デスクトップ上にあるかどうかを示します。
    • IVirtualDesktopManager::MoveWindowToDesktop
      指定した仮想デスクトップにウィンドウを移動します。

    「VirtualDesktopAccessor.dll」には、このインターフェイスでは実現できない機能が含まれているのなんで?どうやって作ってるんだろう?仮想デスクトップ周りって他にも公開情報あるのか?ググったけど見つからなかったので継続調査中・・・

    ソースファイル、助かるーけど、COM周り、シェル周り、相変わらず難しい。Rustで書かれているので、これを機にRustも触ってみようかとインストールしてドキュメントをパラパラした。

    ヒープメモリを使用する変数に所有権あるらしいな。所有権ムーブしたり変数の変更に制限をかけることで二重開放などなどが起こりえない言語仕様になってるとか、なっていないとか?メモリの管理というか、状態の管理で良くバグるのあるある。おかしな動作がパソコン再起動したら直るってそういうことですよねえ。

    所有権を理解する
    https://doc.rust-jp.rs/book-ja/ch04-00-understanding-ownership.html

    25年、29年?何も変わらないWindows のデスクトップアプリの内部、一度公開されたインターフェイスは変わらないですねえ。

    Win32 API のプログラミング リファレンス
    https://learn.microsoft.com/ja-jp/windows/win32/api

    いにしえのソースやドキュメントを見ながら酒飲んでるw 🥴

    時には昔の話を

    https://www.youtube.com/results?search_query=時には昔の話を

Categories

Recommend books

Books I read recently and wanted to share. 📍

松岡まどか、起業します AIスタートアップ戦記

なぜ、あなたの仕事は終わらないのか

それなら、それで

サーキット・スイッチャー

Archive