カテゴリー: Development

  • キーのリマッピング

    AutoHotkey V1→V2

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

    作ったもの

    keyremap_20240501.zip

    ファイルとして公開してなかったので今更ながら置いておく。

  • デスクトップの表示

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

    仕様変更

    • 60秒のタイムアウトで復元は廃止
    • Escキー長押しで復元は廃止
    • 二重起動で復元を実行するように修正

    バグ修正

    • デスクトップ上のアイコンを右クリックして「その他のオプションを確認」を選択すると復元が開始されてしまう動作を修正
    • 最小化されている画面も復元してしまっていたので修正

    機能追加

    • デスクトップの表示時にデスクトップのアイコンにフォーカスを当てるように処理を追加

    作ったもの

    show_desktop_ext_20240602.zip

    「デスクトップの表示」のソースファイル

    #SingleInstance force
    #WinActivateForce
    
    ; define
    DATA_FILE := "デスクトップの表示.dat"
    DESKTOP_CLASS := "ahk_class Progman"
    POPUP1_CLASS := "XamlExplorerHostIslandWindow_WASDK"
    POPUP2_CLASS := "WorkerW"
    
    ; ----------------------------------------
    ; helper function
    ; ----------------------------------------
    
    getString(hwndList) {
        ret := ""
        for index, value in hwndList
            ret .= "|" . value
        return LTrim(ret, "|")
    }
    
    restoreWindow(hwndList, statusList) {
        for index, value in hwndList {
            reverseIndex := hwndList.Length - index + 1
            hwnd := Integer(hwndList[reverseIndex])
            if WinExist(hwnd)
                if (statusList[reverseIndex] != -1) ; skip minimize window
                    WinActivate(hwnd)
        }
    }
    
    ; ----------------------------------------
    ; duplicate run
    ; ----------------------------------------
    
    if FileExist(DATA_FILE) {
        ; read data file
        FileObj := FileOpen(DATA_FILE, "r")
        hwndString := FileObj.ReadLine()
        hwnd := StrSplit(hwndString, "|")
        statusString := FileObj.ReadLine()
        status := StrSplit(statusString, "|")
    
        ; restore window
        restoreWindow(hwnd, status)
    
        ; delete data file
        FileDelete(DATA_FILE)
    
        ; exit
        ExitApp
    }
    
    ; ----------------------------------------
    ;  main process
    ; ----------------------------------------
    
    ; get window handles for restore
    hwnd := WinGetList()
    
    ; get window status
    status := []
    for index, value in hwnd
        status.Push(WinGetMinMax(value))
    
    ; creat data file
    FileAppend(getString(hwnd), DATA_FILE)
    FileAppend("`n", DATA_FILE)
    FileAppend(getString(status), DATA_FILE)
    FileAppend("`n", DATA_FILE)
    
    ; show desktop and focus
    Send "#d"
    Sleep 1000
    hwndDesktop := WinGetID(DESKTOP_CLASS)
    ControlFocus(hwndDesktop)
    
    ; get window handles for monitoring
    hwnd1 := WinGetList()
    
    ; wait new window
    WinWaitNotActive WinExist("A")
    Loop {
        Sleep 500
        hwnd2 := WinGetList()
        try {
            className := WinGetClass("A")
            if ((className != POPUP1_CLASS) && (className != POPUP2_CLASS))
                if getString(hwnd1) != getString(hwnd2)
                    break
        } catch {
        } finally {
            activeId := WinExist("A")
            hwnd2 := WinGetList()
        }
    }
    
    ; restore window
    restoreWindow(hwnd, status)
    
    ; active new window
    try {
        WinActivate(activeId)
    } catch {
        WinActivate(hwnd2[1])
    }
    
    ; delete data file
    if FileExist(DATA_FILE)
        FileDelete(DATA_FILE)

    インストール手順/野良EXE…

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

    以下の2ファイルを差し替えてください。

    C:\tool\desktop
    ├─デスクトップの表示.ahk
    └─デスクトップの表示.exe

    ショートカットファイルの再作成は不要です。

    タスクバーの最左端にショートカットファイルを配置し、「Win」+「1」キーで実行する使用方法を想定しています。「Win」+「Tab」、「Alt」+「Tab」などと共に使用してください。

    機能追加予定

    たまに動作おかしいのでまたバグ修正するかもしれません。

    備忘

    いじわるテストするとすぐに不具合が発生する。

    プロセスの一覧に変更があったことを検知して画面の復元を開始しているが、デスクトップを表示して1秒未満でアプリを実行されると画面の復元が開始できない。Autohotkeyで正しくプロセスの一覧が取得できるようになるまでタイムラグがあり1秒待ちを外すとプロセスを正しく監視できない。

    また、起動されるアプリについても多様なアプリが存在していてプロセスの一覧が変わったからといって画面を復元するためのウインドハンドルが取得できるわけではないため、ここでも待ち時間が必要となり動きとしては復元開始までにタイムラグが発生してしまっている。動きがもっさりして気持ち悪いが、仕方ないかと。

    デスクトップを表示した後、以下のようなアプリや操作ではプロセスの状態が正しく取得できず画面が復元されない場合がある。

    • スプラッシュ画面が表示されるような起動時間が長いアプリを起動する
    • スタートメニューやタスクビューを操作する
    • タスクマネージャーなどWindowsのシステムのアプリを最小化から復元する

    二重起動したら画面を復元するようにしたので画面の配置を壊して終わることはなくなったが、正しく動かないケースが多々あると思われる。

    コンパイル方法

    自分でソースを修正するような人は、そもそもこんなツールは使わないのかもしれないけれど、個々の環境で待ち時間のチューニングなどが必要かもしれないのでコンパイル方法を記載しておきます。

    1. スタートメニューで「AutoHotkey Dash」を選択する。

    2. 「Compile」を選択する。

    初回の選択時にコンパラがインストールされます。

    3. 「Compile」を起動し、「Base File」を選択を「Sava」ボタンをクリックします。

    4. 「デスクトップの表示.ahk」ファイルを右クリックし、「Compile script(GUI)」を選択します。

    C:\tool\desktop
    ├─デスクトップの表示.ahk
    └─デスクトップの表示.exe

    5. 「Convert」ボタンをクリックします。

    →「デスクトップの表示.exe」が生成されます。

    コンパイル方法を書いておけば怪しげなEXEファイルを添付する必要がないかもしれない。これを貼っておこー

    「デスクトップの表示.ahk」を直接実行できるが、「デスクトップの表示.ahk」をタスクバーにピン止めするとアイコンが変更できない。アイコンを変更するためにはEXEファイルのショートカットである方が都合が良いとの理由でEXEを添付したのだけど、怪しげな野良EXEセキュリティ的には実行したくはないよな。

    Windows セキュリティに除外を追加する

    https://support.microsoft.com/ja-jp/windows/windows-セキュリティに除外を追加する-811816c0-4dfd-af4a-47e4-c301afe13b26

    環境によっては、「C:\tool\desktop」フォルダに対して除外の設定が必要かもしれない。

  • デスクトップの表示

    「デスクトップの表示.exe – ショートカット」を作ったので貼っておこー

    背景

    「通り抜けループ」や「WipeOut」でデスクトップ上のアイコンにアクセスしようとしたけれど古いアプリなので正常に動作しないことが分かった。

    やりたいこと

    macOSのミッションコントロールのホットコーナーで「デスクトップ」を指定したときのようにデスクトップにアクセスしたい。

    Windows標準機能

    「Win」キー + D でデスクトップが表示できる。
    →デスクトップを表示した後、アプリを起動した場合、再度ショートカットを押下しても画面の配置が復元されない。

    やったこと

    「通り抜けループ」や「WipeOut」の動作確認、および類似ソフトを調査した。

    WinXCornersRegistryFix
    https://github.com/vhanla/winxcorners/releases

    Windowsでもホットコーナーの「デスクトップ」が設定可能かと思ったら元の画面の配置は復元されなかった。

    作ったもの

    show_desktop_ext_20240526.zip

    「デスクトップの表示」のソースファイル

    #SingleInstance force
    
    ; show desktop
    Send "#d"
    Sleep 1000
    
    ; get window handles
    hwnd1 := WinGetList()
    
    ; time out 60s.
    Loop 60
    {
        Sleep 1000
    
        ; window handles monitoring
        hwnd2 := WinGetList()
        if getString(hwnd1) != getString(hwnd2)
            break
        if GetKeyState("Esc")
            break
    }
    
    ; window restore
    for index, value in hwnd2
    {
        hwnd := hwnd2[hwnd2.Length - index + 1]
        if WinExist(hwnd)
            WinActivate(hwnd)
    }
    
    ; helper function
    getString(array)
    {
        ret := ""
        for index, value in array
            ret .= "|" . value
        ret := LTrim(ret, "|")
        return ret
    }

    「デスクトップの表示」を実行するとデスクトップが表示されます。デスクトップで何かしらのアプリを起動/操作などすると元の画面の配置を復元します。

    また、Escキーの長押し、60秒経過でも終了します。

    インストール手順/野良EXE…

    以下の手順では、ショートカットファイルを作成してアイコンを変更しています。アイコンを変更する必要がない場合は作業不要です。直接、ahkファイルを実行してください。

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

    C:\tool\desktop
    ├─デスクトップの表示.ahk
    └─デスクトップの表示.exe

    ※格納場所任意。

    2. 「デスクトップの表示.exe」を右クリックして「ショートカットの作成」を選択します。

    3. 作成された「デスクトップの表示.exe – ショートカット」を右クリックして「プロパティ」を選択します。

    4. 「ショートカット」タブで「アイコンの変更」ボタンを選択します。

    5. 「参照」ボタンでエクスプローラーを指定し、アイコンを選択します。

    6. 「デスクトップの表示.exe – ショートカット」をタスクバーにピン止めして実行します。

    アンインストール

    1. タスクバーにピン止めしたアイコンを削除します。

    2. ダウンロードしたフォルダごと削除します。

    動作確認環境

    • Windows 11
    • Autohotkey V2

    機能追加予定

    たまに動作おかしいのでバグ修正するかもしれません。

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

    戻り値
    ウィンドウは、(デスクトップ上の積み重ね方に従って)最上位から最下位へと順番に検索される。

    おかしいなぁ…

  • Chrome拡張機能

    拡張機能を作ったので貼っておこー

    背景

    タスクバーをダブルクリックしたときに、タスクバーの表示・非表示を変更しています。

    なお、アプリや画面の操作は画面上部でまとめて行いたいので、以下のアプリでタスクバーを画面上部に配置しています。

    Explorer Patcher for Windows 11
    https://github.com/valinet/ExplorerPatcher

    やりたいこと

    Chromeのブックマークバーの表示・非表示もマウス操作で切り替えたい。

    ブックマークバーの高さ(40px)分を非表示にして使いたい。

    Chromeの標準機能

    画面右上「…」で「ブックマークとリスト」-「ブックマークバーを表示」/「ブックマークバーを非表示」を選択する。
    →メニューが多くて2階層、3階層と辿る操作がメンドクサイ。

    キーボード操作では、Ctrl + Shift + B が使用可能。
    →こんなの覚えてられない。キーボードを使いたくない。

    やったこと

    Chrome ウェブストア
    https://chromewebstore.google.com/

    ブックマーク関連の拡張機能を検索したけれど見つからなかった。

    よく使うキーボードショートカットをマウスから実行できないのか?

    Chrome Extensions > Reference > API
    https://developer.chrome.com/docs/extensions/reference/api?hl=ja

    標準機能を呼び出すAPIが見つけられない。

    また、セキュリティ的にも「Ctrl + Shift + B」キーを投げつけるようなことはできないのか?

    拡張機能の作り方の調査…

    以下の記事で実装できそうなのでやってみた。

    Chrome拡張機能とローカルアプリでプロセス間通信
    https://dev.classmethod.jp/articles/chrome-native-message/

    ネイティブ メッセージング
    https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging?hl=ja

    作ったもの

    拡張機能のアイコンをクリックしてブックマークバーの表示/非表示を切り替え可能です。

    参考にしたサイトのソースからプロセス間通信の処理を削除して、ローカルアプリの実行のみ行っています。

    if WinExist("ahk_exe chrome.exe") {
        WinActivate
        Send "^+b"
    }

    ローカルアプリといっても、Autohotkeyのスクリプトで上記の4行を実行してChromeに「Ctrl + Shift + B」キーを送信するだけです。

    なお、アイコンは、Googleのサイトから借用しています。ちょっと小さい。

    Material Symbols & Icons
    https://fonts.google.com/icons

    拡張機能のソースファイル

    bookmarks_bar_ext_20240514.zip

    インストール手順/野良拡張機能の読み込み

    1. 「bookmarks_bar_ext_20240514.zip」ファイルを展開し、C:ドライブの直下に格納します。
    C:\tool\chrome
    ├─bookmarks_bar_ext.ahk
    ├─bookmarks_bar_ext.json
    ├─レジストリ削除.reg
    ├─レジストリ登録.reg
    └─Extension
        ├─html
        ├─images
        └─js

    ※格納場所固定。

    2. 以下をアドレスバーに入力してChromeの機能拡張ページを表示します。
    chrome://extensions/

    3. 「パッケージ化されていない拡張機能を読み込む」ボタンで上記の「Extension」フォルダを指定します。

    4. 読み込んだ拡張機能のIDを確認します。

    5. 以下のファイルの拡張機能のID「jmkojgalabgapeklppjcmheekpnjedgh」部分を手順4.で確認したIDに修正します。

    bookmarks_bar_ext.json

    {
        "name": "bookmarks_bar_ext",
        "description": "bookmarks bar extension for chrome",
        "path":"C:\\tool\\chrome\\bookmarks_bar_ext.ahk",
        "type": "stdio",
        "supports_native_initiated_connections": true,
        "allowed_origins": ["chrome-extension://jmkojgalabgapeklppjcmheekpnjedgh/"]
    }

    ※最後のスラは必須

    6. 「更新」ボタンで再読み込みします。

    7. 「レジストリ登録.reg」ファイルを実行してレジストリを追加します。

    アンインストール

    1. Chromeの機能拡張ページで拡張機能を削除します。

    2. 「レジストリ削除.reg」ファイルを実行してレジストリを削除します。

    動作確認環境

    • Windows 11
    • Chrome 最新版
    • Autohotkey V2

    自分の環境では意図したとおり動作していますが、動作保証はいたしかねます…w

    「新しいタブ」では、ブックマークバーの非表示が機能しないようです。(Chromeの仕様)

    機能追加予定

    ChromeのAPIで簡単に実装できるのかもしれませんが、拡張機能について初めて調べてまったくの知識不足のため、上記のとおりローカルアプリ実行する実装となっています。

    レジストリにキーを1つ追加してあげるだけでChromeとローカルアプリが連携できることが分かったのは良かったかな。___φ(. . )メモメモ

    他のショートカットキーも追加していけば機能拡張は可能です。1個できるとN個できるやつ。機能追加予定はありません。

  • トリグキーの備忘録(定期)

    Windows 11を再インストールするとリテール版のライセンスに切り替わる。

    ライセンス確認

    slmgr /dli
    before
    after

    Windows 11 をダウンロードする
    https://www.microsoft.com/ja-jp/software-download/windows11

    Windows 11をUSBメモリーに書き込み。

    BIOS画面は、EscまたはDeleteキーで表示する。

    USBメモリーからブートしてインストール先の選択時に「C:\Driver」のLANドライバまたはWi-Fiドライバを読み込む。

    Windows起動後、「C:\Windows.old」が作成されているので削除する。

  • AutoHotkey V1→V2

    https://www.autohotkey.com

    非互換で動かなかったので修正した。

    キーのリマッピング
    https://ahkscript.github.io/ja/docs/v2/misc/Remap.htm

    ; 矢印キー × 5
    ^*Up::
    {
    	Send "{UP 5}"
    }
    
    ^*Down::
    {
    	Send "{Down 5}"
    }
    
    ^*Left::
    {
    	Send "{Left 5}"
    }
    
    ^*Right::
    {
    	Send "{Right 5}"
    }
    
    ; 削除
    ^*h::
    {
    	Send "{BS}"
    }
    
    ; ディスプレイ情報取得
    getDisplayInfo(&x, &y, &height, &width)
    {
    	MonitorGetWorkArea(1, &Left, &Top, &Right, &Bottom)
    	OutputDebug("Left=" . Left . " Top=" . Top . " Right=" . Right . " Bottom=" . Bottom)
    	x := Left
    	y := Top
    	height := Bottom - Top
    	width := Right - Left
    }
    
    ; 画面左移動
    !1::
    {
    	getDisplayInfo(&x, &y, &height, &width)
    	hwnd := WinGetID("A")
    	WinMove(x, y, width/2, height, hwnd)
    }
    
    ; 画面中央
    !2::
    {
    	getDisplayInfo(&x, &y, &height, &width)
    	hwnd := WinGetID("A")
    	WinMove(width*0.1, y, width*0.8, height, hwnd)
    }
    
    ; 画面右移動
    !3::
    {
    	getDisplayInfo(&x, &y, &height, &width)
    	hwnd := WinGetID("A")
    	WinMove(x + width/2, y, width/2, height, hwnd)
    }
    
    ; 音量調整
    ^F10::
    {
    	Send "{VOLUME_MUTE}"
    }
    
    ^F11::
    {
    	Send "{VOLUME_DOWN}"
    }
    
    ^F12::
    {
    	Send "{VOLUME_UP}"
    }

    Ctrl + 矢印キー:矢印キー5回連打
    Ctrl + hキー :BackSpace
    Alt + 1キー :アクティブ画面左寄せ
    Alt + 2キー :アクティブ画面中央寄せ
    Alt + 3キー :アクティブ画面右寄せ
    Ctrl + F10 :音量ミュート
    Ctrl + F11 :音量Down
    Ctrl + F12 :音量UP

    無変換キー:IMEオフ*
    変換キー:IMEオン*

    *:Windowsの機能で設定。タスクバーの「あ」-「設定」-「キーとタッチのカスタマイズ」

    既知の問題点

    Alt + 数字 で アクティブ画面を移動したときに数ピクセルずれる。画面まわりの影分のピクセルを考慮する必要があるけど放置する。Windows 11のスナップ機能で代替可能(Winキー + 矢印キー)なのでいらなくなる予定。

    Windows 11のスナップ機能

    最大化、最小化、スナップ……[Windows]+矢印キーでウィンドウを自在に操る
    https://forest.watch.impress.co.jp/docs/shseri/usefulkeys/1431434.html

    デスクトップを分割・複数のアプリを並べる「スナップ レイアウト」がよりスマートに
    https://forest.watch.impress.co.jp/docs/news/insiderpre/1563875.html

    Rectangle

    macOSでは、Rectangle を使用していたのでこれも貼っておこー

    Rectangle
    https://rectangleapp.com/

    Spectacle
    https://github.com/eczarny/spectacle

    Caps Lockキーを左Ctrlキーに置換

    https://ahkscript.github.io/ja/docs/v2/KeyList.htm#IME

    AutoHotkey V2.0では、Caps Lockキーが扱えるのかもしれないけど従来どおりChange Keyで置き換えたのでこれも貼っておこー

    Change Key
    https://forest.watch.impress.co.jp/library/software/changekey

    Sysinternals Ctrl2Cap
    https://learn.microsoft.com/ja-jp/sysinternals/downloads/ctrl2cap

    KeyTweak
    https://www.bleepingcomputer.com/download/keytweak/

  • 通り抜けループ version 3.04

    現在入手不可。ググったけど見つからないので、古いバックアップファイルからコピーした。

    Windows VistaでWindows AeroのUIになった頃から使えなくなったフリーソフトが、Windows 10 や 11では問題なく使えたりする。Windowsの互換性すげえなあ。

    最近は、仮想デスクトップが使えるからこのたぐいのソフトは要らないかもしれないけど、デスクトップにファイルを置いて作業する人には便利なユーティリティソフトたち。20年以上前に使っていたソフト再び…

    要るか要らないかはあなた次第です。

    https://www.vector.co.jp/magazine/softnews/100615/n1006151.html

    WipeOut

    問題なく使えそう。

    https://hp.vector.co.jp/authors/VA031384/software/WipeOut.html

    PopUp Icons for Vista/7/8

    Windows XP互換モードで起動可能。

    https://chihiro718.jpn.org/software/PopUpIcons/index.html

    DeskLamp

    起動不可か?

    http://labo.piny.jp/desklamp/

     

    You
    「懐かしいソフトウェア」を略してなんと言いますか?

    ChatGPT
    「懐ソフト」ですね。

    👍

  • Windows 11 on トリグキーの備忘録

    フリーソフトのインストール

    とりあえず以下のソフトをインストールした。

    • ChromeSetup.exe
    • 7z2404-x64.exe
    • VSCodeUserSetup-x64-1.88.1.exe
    • Git-2.44.0-64-bit.exe
    • ChgKey15.LZH
    • AutoHotkey104805_Install.exe
    • CareUEyes_Lite.exe*
    • hm934_signed.exe
    • hmfilerclassic188_x64_signed.exe
    • ep_setup.exe*
    • 7tt_setup.exe
    • thru304.zip**
    • teraterm-5.2.exe
    • WinSCP-6.3.3-Setup.exe
    • PowerToysUserSetup-0.80.1-x64.exe
    • RunCat-x64.zip*
    • windowsdesktop-runtime-6.0.29-win-x64.exe

    *:初めてインストールして試用中。
    **:通り抜けループ。バックアップファイルからコピーした。

    フォントのインストール

    Chromeのメイリオが美しくないのでフォントを変更した。

    Noto CJK fonts
    https://github.com/notofonts/noto-cjk

    日本語フォント
    https://github.com/notofonts/noto-cjk/tree/main/Sans/OTF/Japanese

    • NotoSansCJKjp-Black.otf
    • NotoSansCJKjp-DemiLight.otf
    • NotoSansCJKjp-Light.otf
    • NotoSansCJKjp-Medium.otf
    • NotoSansCJKjp-Regular.otf
    • NotoSansCJKjp-Thin.otf
    • NotoSansCJKjp-Bold.otf

    Chromeの拡張機能を追加
    Stylus
    https://add0n.com/stylus.html

    すべてのタグにフォントを指定した。

    * {
        font-family: 'Noto Sans CJK JP DemiLight';
    }

    macがいいね…

    夜中に勝手にスリープ解除された

    イベントログ

    システムは低電力状態から再開しました。
    
    スリープ時間: 2024-04-27T14:19:51.760377200Z
    スリープ解除時間: 2024-04-27T17:21:23.876107000Z
    
    スリープ状態の解除元: デバイス -ACPI Wake Alarm

    対処方法

    コントロール パネル\すべてのコントロール パネル項目\電源オプション\プラン設定の編集
    「詳細な電源設定の変更」
    「スリープ」
    「スリープ解除タイマーの許可」
    「有効」→「無効」に変更

    マウスでのスリープ解除も無効化

    デバイスマネージャー
    HID準拠マウスのプロパティ
    「このデバイスで、コンピュータのスタンバイ状態を解除できるようにする」のチェックを外す。

    ディスクの分割

    ディスクが分割されていない。C:ドライブだけで全容量を使用している。
    システムファイルとデータファイルは、分けておきたいので別途。

    絵文字👍

    「Windows」キー + 「.」キー

    初めてこれ使った。Windowsにも文字ビューアある。

  • ミニPC N100 インテル最新のAlder Lake-Nシリーズ (4C/4T,最大3.4GHz) TRIGKEY G5 Mini PC 16GB DDR5 500GB M.2 NVME SSD 4K@60Hz 小型PC ダブル LAN | 高速WiFi 6 | BT 5.2 | USB 3.2 静音小型パソコン 省電力

    https://www.amazon.co.jp/gp/product/B0C5C42G8W/

    ミニPCが流行っているようなので3万円で買ってみた。

    トリグキー。今のところ問題なく使えている。

    備忘録:

    Windowsのセットアップは、ローカルユーザーで行うこと。MicrosoftアカウントにログインしてWindowsをセットアップすると意図しないフォルダ名でユーザーが作成される。Microsoftアカウントの先頭5文字で切られるのバグやん。

    ユーザーを再作成する方法をググって、Microsoftアカウントからサインアウトして、ローカルユーザーを作成して、OSからサインアウトして、作成したユーザーにサインインして、新たにユーザーを作成して、新しいユーザーにサインインして、Microsoftアカウントにサインインして、旧ユーザーのフォルダを削除するみたい変な作業が発生して草。

    あとは、Amazonの書き込みにもあったけどWindowsライセンスがボリュームライセンスなので問い合せしないとライセンス問題が発生するのかもしれない。