[{"data":1,"prerenderedAt":334},["ShallowReactive",2],{"$f3vign1p97ubpl":3,"$f1swfsv86m96a9":92,"$f36sbx4f3r6acp":233},{"entry":4,"before":55},{"metadata":5,"sys":8,"fields":29},{"tags":6,"concepts":7},[],[],{"space":9,"id":14,"type":15,"createdAt":16,"updatedAt":17,"environment":18,"publishedVersion":22,"revision":23,"contentType":24,"locale":28},{"sys":10},{"type":11,"linkType":12,"id":13},"Link","Space","jmfsolylwbqz","rnhRO2M92ER1D1aOnJkgE","Entry","2026-11-13T12:24:46.416Z","2026-11-13T12:33:09.969Z",{"sys":19},{"id":20,"type":11,"linkType":21},"master","Environment",95,2,{"sys":25},{"type":11,"linkType":26,"id":27},"ContentType","blogPost","ja-JP",{"title":30,"slug":31,"category":32,"body":51,"description":52,"legacy":53,"enableAd":54,"enableCommentField":54},"【Logicool MX Keys Mini】使うソフトに応じてFnロックを自動的に切り替える方法","logi-auto-fn",{"metadata":33,"sys":36,"fields":48},{"tags":34,"concepts":35},[],[],{"space":37,"id":39,"type":15,"createdAt":40,"updatedAt":40,"environment":41,"publishedVersion":43,"revision":44,"contentType":45,"locale":28},{"sys":38},{"type":11,"linkType":12,"id":13},"5MKCmbhhcqboMXodYszCG6","2021-11-16T05:31:22.875Z",{"sys":42},{"id":20,"type":11,"linkType":21},3,1,{"sys":46},{"type":11,"linkType":26,"id":47},"category",{"name":49,"slug":50},"役立ち情報","useful","MX Keys Mini はファンクションキーとメディアキーが同じキーを共有しており、Fnキーで切り替える方式になっています。コンパクトな反面、ファンクションキーを多用するゲームで毎回Fnキーと同時に押すのは面倒…かといって常にFnロックにすると接続先切り替えが面倒。ということで、ゲームないし特定のアプリケーション起動時にだけFnロックにする方法を調査しました。\n\n## Logi Options+にはそんな機能ない\n\nまず調べたのは公式アプリ、Logi Options+。しかし一目みて分かる通り、**キーボード関連の機能はめちゃくちゃ少ない**です。当然アプリに応じてFnロックを切り替える機能はありません。あるのは常時一括で切り替えるスイッチのみ。\n\nそこでClaudeさんと相談してみると、どうやらLogi Options+とキーボードは**HID++というプロトコル**で通信しているという話を聞きつけました。\n\n## レッツ・リバースエンジニアリング\n\nというわけで、Logi Options+で先程のスイッチを切り替えるとき、キーボードにはどんな信号が送られているのかを調査しました。Wiresharkを使って、Logi Boltに送られるusbhid信号をキャプチャーします。送信されているパケットを特定し、送信内容をClaudeに解析してもらったところ、以下のような内容を送受信していることが判明しました。PCからの信号は特に暗号化とかはされていないようです。\n\n```\nFロック ON:  10 01 0c 1b 00 00 01\nFロック OFF: 10 01 0c 1b 00 01 01\n```\n\nこの6バイト目の値がFnロック状態のフラグのようです。これを[hidapitester](https:\u002F\u002Fgithub.com\u002Ftodbot\u002Fhidapitester)を使ってドングルから送信します。昔のUnifyingレシーバーが刺さっていたり、hidapitesterが勝手にバイト長をパディングしたりしたせいでなかなかうまく行きませんでしたが、なんとか動作する方法を特定。\n\n```\nhidapitester --vidpid 046d\u002Fc548 --usagePage 0xFF00 --usage 0x0001 --open --length 7 --send-output \u003Cbytes>\n```\n\n`\u003Cbytes>`の部分は上のフラグを含んだバイト列（0x10のような形式でカンマ区切り）です。\n\n## AutoHotKeyに組み込む\n\n次は最前面のアプリに応じて切り替える信号を送る方法ですが、こちらもClaudeが教えてくれた[AutoHotKey](https:\u002F\u002Fwww.autohotkey.com\u002F)というソフトを使います。`autofnlock.ahk`のようなファイル名のスクリプトを適当な場所に作成し、ダブルクリックすると機能するようになります。以下がコード例ですが、最前面にあるアプリのexe名を1秒毎にポーリングし、切り替え時には右下に小さく通知を表示するようになっています。`Games`の部分はお好みで書き換えてください。`HidapitesterPath`も実際のパスに書き換えるのを忘れずに。\n\n```ahk\n#Requires AutoHotkey v2.0\n#SingleInstance Force\n\nGames := [\"GenshinImpact.exe\", \"StarRail.exe\", \"NexusAnima.exe\", \"ZenlessZoneZero.exe\", \"Endfield.exe\"]\nHidapitesterPath := \"C:\\Freeware\\hidapitester.exe\"\nCurrentState := -1  ; -1=未初期化, 0=メディア, 1=Fロック\n\nShowNotification(text) {\n    static notifyGui := \"\"\n    if (notifyGui)\n        notifyGui.Destroy()\n    \n    notifyGui := Gui(\"+AlwaysOnTop -Caption +ToolWindow +E0x20\", \"FnLock\")\n    notifyGui.BackColor := \"202020\"\n    notifyGui.SetFont(\"s11 cWhite\", \"Segoe UI\")\n    notifyGui.Add(\"Text\", \"x15 y10 w150 h25 Center\", text)\n    \n    ; 画面右下に配置\n    screenW := A_ScreenWidth\n    screenH := A_ScreenHeight\n    notifyGui.Show(Format(\"x{1} y{2} w210 h45 NoActivate\", screenW - 230, screenH - 100))\n    WinSetTransparent(200, notifyGui)\n    \n    SetTimer(() => notifyGui.Destroy(), -1500)\n}\n\nSetFnLock(fnLock) {\n    global HidapitesterPath, CurrentState\n    if (CurrentState = fnLock)\n        return\n    payload := fnLock \n        ? \"0x10,0x01,0x0c,0x1b,0x00,0x00,0x01\"  ; Fロック ON\n        : \"0x10,0x01,0x0c,0x1b,0x00,0x01,0x01\"  ; メディアキー\n    cmd := Format('\"{1}\" --vidpid 046d\u002Fc548 --usagePage 0xFF00 --usage 0x0001 --open --length 7 --send-output {2}', HidapitesterPath, payload)\n    RunWait('cmd.exe \u002Fc ' cmd, , \"Hide\")\n    CurrentState := fnLock\n\n    msg := fnLock ? \"🔒 Fnロック ON\" : \"🔓️ Fnロック解除\"\n    ShowNotification(msg)\n}\n\nIsGameActive() {\n    global Games\n    try {\n        proc := WinGetProcessName(\"A\")\n        for game in Games\n            if (StrLower(proc) = StrLower(game))\n                return true\n    }\n    return false\n}\n\nCheckActiveWindow(*) {\n    SetFnLock(IsGameActive() ? 1 : 0)\n}\n\n; 起動時に一度実行 + 1秒おきにポーリング\nCheckActiveWindow()\nSetTimer(CheckActiveWindow, 1000)\n```\n\nあとは、`shell:startup`に.ahkファイルへのショートカットを置いておけば、PC起動時に自動的に動くようになります。","",false,true,{"metadata":56,"sys":59,"fields":71},{"tags":57,"concepts":58},[],[],{"space":60,"id":62,"type":15,"createdAt":63,"updatedAt":64,"environment":65,"publishedVersion":67,"revision":68,"contentType":69,"locale":28},{"sys":61},{"type":11,"linkType":12,"id":13},"5CkTaQ1eFhokfqporeYyPp","2026-08-25T11:38:16.168Z","2026-08-26T12:40:36.230Z",{"sys":66},{"id":20,"type":11,"linkType":21},46,5,{"sys":70},{"type":11,"linkType":26,"id":27},{"title":72,"slug":73,"category":74,"body":91,"description":52,"legacy":53,"enableAd":53,"enableCommentField":54},"「崩壊：スターレイル 素材ノート」更新終了のお知らせ","end-of-update-hsr-matnote",{"metadata":75,"sys":78,"fields":88},{"tags":76,"concepts":77},[],[],{"space":79,"id":81,"type":15,"createdAt":82,"updatedAt":83,"environment":84,"publishedVersion":68,"revision":23,"contentType":86,"locale":28},{"sys":80},{"type":11,"linkType":12,"id":13},"6NDaVz7bY8a3U7Q5dNuqWX","2021-05-03T06:53:04.429Z","2021-05-03T06:53:19.208Z",{"sys":85},{"id":20,"type":11,"linkType":21},{"sys":87},{"type":11,"linkType":26,"id":47},{"name":89,"slug":90},"お知らせ","info","## 「崩壊：スターレイル 素材ノート」更新終了のお知らせ\n\nいつも本アプリをご利用いただき、ありがとうございます。\n\nこのたび、「崩壊：スターレイル 素材ノート」におきまして、ゲームのバージョンアップ対応（データ追加）を終了させていただきます。公開以来、ご利用いただきました方々には感謝申し上げます。\n\n現状、最後に対応を行ったバージョンは4.2となっておりますが、**4.3以降のデータを追加する予定はありません**。ご案内が遅くなりましたことを深くお詫び申し上げます。\n\nWebアプリ本体につきましては**2027年1月頃**まで公開を行う予定ですが、それ以降は本お知らせへのリダイレクトとなる予定です。その後、どこかのタイミングで「matnote.app」のドメインを削除する予定です。そのため、本アプリをブックマークしていたり、リンクしていたりする方は、**ブックマークや投稿を削除したり、リンクを削除するなど**の対応をお願いいたします。ドメイン削除後にアクセスした際に何らかのWebページに接続できた場合、それは私が管理するWebページではございません。\n\n以前、「原神素材ノート」の公開終了を撤回した際は混乱を招いてしまいましたが、今回の終了については撤回することはないと思っています。\n\nご不便をおかけしますが、何卒ご了承ください。\n\n## 【2026\u002F08\u002F26 追記】現在提供している各種機能について\n\n- 跳躍天井カウンターの履歴につきましては、必要に応じてサイト閉鎖までに各自エクスポートをお願いいたします。新しい統合版「天井カウンター」に移行できます。\n- デバイス間同期機能につきましては、サイト閉鎖まではこれまで通りご利用いただけます。",{"sys":93,"total":95,"skip":96,"limit":68,"items":97,"includes":195},{"type":94},"Array",109,0,[98,113,132,157,176],{"fields":99,"sys":112},{"title":72,"slug":73,"category":100},{"metadata":101,"sys":104,"fields":111},{"tags":102,"concepts":103},[],[],{"space":105,"id":81,"type":15,"createdAt":82,"updatedAt":83,"environment":107,"publishedVersion":68,"revision":23,"contentType":109,"locale":28},{"sys":106},{"type":11,"linkType":12,"id":13},{"sys":108},{"id":20,"type":11,"linkType":21},{"sys":110},{"type":11,"linkType":26,"id":47},{"name":89,"slug":90},{"createdAt":63,"id":62,"type":15},{"fields":114,"sys":129},{"title":115,"slug":116,"category":117},"[MX Keys] ゲームのスクリーンショットを撮りたいだけなのに、Shiftキーが入力されてしまう","mx-keys-print-screen",{"metadata":118,"sys":121,"fields":128},{"tags":119,"concepts":120},[],[],{"space":122,"id":39,"type":15,"createdAt":40,"updatedAt":40,"environment":124,"publishedVersion":43,"revision":44,"contentType":126,"locale":28},{"sys":123},{"type":11,"linkType":12,"id":13},{"sys":125},{"id":20,"type":11,"linkType":21},{"sys":127},{"type":11,"linkType":26,"id":47},{"name":49,"slug":50},{"createdAt":130,"id":131,"type":15},"2026-08-15T15:23:40.413Z","65OMt4x9G2qTA4GZTvpN1G",{"fields":133,"sys":154},{"title":134,"slug":135,"category":136},"Dart\u002FFlutterの非同期の仕組みについて思うところをつらつらと","flutter-async-architecture",{"metadata":137,"sys":140,"fields":151},{"tags":138,"concepts":139},[],[],{"space":141,"id":143,"type":15,"createdAt":144,"updatedAt":145,"environment":146,"publishedVersion":148,"revision":43,"contentType":149,"locale":28},{"sys":142},{"type":11,"linkType":12,"id":13},"4QnljevVGe4bI4JNVdk2Zc","2021-05-02T15:11:20.089Z","2021-11-16T05:32:02.763Z",{"sys":147},{"id":20,"type":11,"linkType":21},17,{"sys":150},{"type":11,"linkType":26,"id":47},{"name":152,"slug":153},"どうでもいいこと","others",{"createdAt":155,"id":156,"type":15},"2026-06-28T13:08:24.808Z","43SeLsLF422R4RGvtCH2y6",{"fields":158,"sys":173},{"title":159,"slug":160,"category":161},"IntelliJ IDEAをJujutsuのコンフリクト解決ツールとしてちゃんと使えるようにするプラグインを作ったよ","idea-mergex-plugin",{"metadata":162,"sys":165,"fields":172},{"tags":163,"concepts":164},[],[],{"space":166,"id":39,"type":15,"createdAt":40,"updatedAt":40,"environment":168,"publishedVersion":43,"revision":44,"contentType":170,"locale":28},{"sys":167},{"type":11,"linkType":12,"id":13},{"sys":169},{"id":20,"type":11,"linkType":21},{"sys":171},{"type":11,"linkType":26,"id":47},{"name":49,"slug":50},{"createdAt":174,"id":175,"type":15},"2026-06-05T01:09:11.677Z","73BxP4cAKyGEaY0iSdAFJB",{"fields":177,"sys":192},{"title":178,"slug":179,"category":180},"Jujutsuのマージコンフリクト解決ツールとして IntelliJ IDEA を使用する方法（macOS）","jujutsu-merge-idea",{"metadata":181,"sys":184,"fields":191},{"tags":182,"concepts":183},[],[],{"space":185,"id":39,"type":15,"createdAt":40,"updatedAt":40,"environment":187,"publishedVersion":43,"revision":44,"contentType":189,"locale":28},{"sys":186},{"type":11,"linkType":12,"id":13},{"sys":188},{"id":20,"type":11,"linkType":21},{"sys":190},{"type":11,"linkType":26,"id":47},{"name":49,"slug":50},{"createdAt":193,"id":194,"type":15},"2026-05-17T15:49:45.333Z","jBqOc4f2Q8xuAReMTNli2",{"Entry":196},[197,209,221],{"metadata":198,"sys":201,"fields":208},{"tags":199,"concepts":200},[],[],{"space":202,"id":143,"type":15,"createdAt":144,"updatedAt":145,"environment":204,"publishedVersion":148,"revision":43,"contentType":206,"locale":28},{"sys":203},{"type":11,"linkType":12,"id":13},{"sys":205},{"id":20,"type":11,"linkType":21},{"sys":207},{"type":11,"linkType":26,"id":47},{"name":152,"slug":153},{"metadata":210,"sys":213,"fields":220},{"tags":211,"concepts":212},[],[],{"space":214,"id":39,"type":15,"createdAt":40,"updatedAt":40,"environment":216,"publishedVersion":43,"revision":44,"contentType":218,"locale":28},{"sys":215},{"type":11,"linkType":12,"id":13},{"sys":217},{"id":20,"type":11,"linkType":21},{"sys":219},{"type":11,"linkType":26,"id":47},{"name":49,"slug":50},{"metadata":222,"sys":225,"fields":232},{"tags":223,"concepts":224},[],[],{"space":226,"id":81,"type":15,"createdAt":82,"updatedAt":83,"environment":228,"publishedVersion":68,"revision":23,"contentType":230,"locale":28},{"sys":227},{"type":11,"linkType":12,"id":13},{"sys":229},{"id":20,"type":11,"linkType":21},{"sys":231},{"type":11,"linkType":26,"id":47},{"name":89,"slug":90},{"sys":234,"total":235,"skip":96,"limit":68,"items":236,"includes":320},{"type":94},32,[237,252,267,282,301],{"fields":238,"sys":251},{"title":115,"slug":116,"category":239},{"metadata":240,"sys":243,"fields":250},{"tags":241,"concepts":242},[],[],{"space":244,"id":39,"type":15,"createdAt":40,"updatedAt":40,"environment":246,"publishedVersion":43,"revision":44,"contentType":248,"locale":28},{"sys":245},{"type":11,"linkType":12,"id":13},{"sys":247},{"id":20,"type":11,"linkType":21},{"sys":249},{"type":11,"linkType":26,"id":47},{"name":49,"slug":50},{"createdAt":130,"id":131,"type":15},{"fields":253,"sys":266},{"title":159,"slug":160,"category":254},{"metadata":255,"sys":258,"fields":265},{"tags":256,"concepts":257},[],[],{"space":259,"id":39,"type":15,"createdAt":40,"updatedAt":40,"environment":261,"publishedVersion":43,"revision":44,"contentType":263,"locale":28},{"sys":260},{"type":11,"linkType":12,"id":13},{"sys":262},{"id":20,"type":11,"linkType":21},{"sys":264},{"type":11,"linkType":26,"id":47},{"name":49,"slug":50},{"createdAt":174,"id":175,"type":15},{"fields":268,"sys":281},{"title":178,"slug":179,"category":269},{"metadata":270,"sys":273,"fields":280},{"tags":271,"concepts":272},[],[],{"space":274,"id":39,"type":15,"createdAt":40,"updatedAt":40,"environment":276,"publishedVersion":43,"revision":44,"contentType":278,"locale":28},{"sys":275},{"type":11,"linkType":12,"id":13},{"sys":277},{"id":20,"type":11,"linkType":21},{"sys":279},{"type":11,"linkType":26,"id":47},{"name":49,"slug":50},{"createdAt":193,"id":194,"type":15},{"fields":283,"sys":298},{"title":284,"slug":285,"category":286},"DartのSwitch式\u002F文、when句、パターンマッチング周りのチートシート","dart-pattern-matching",{"metadata":287,"sys":290,"fields":297},{"tags":288,"concepts":289},[],[],{"space":291,"id":39,"type":15,"createdAt":40,"updatedAt":40,"environment":293,"publishedVersion":43,"revision":44,"contentType":295,"locale":28},{"sys":292},{"type":11,"linkType":12,"id":13},{"sys":294},{"id":20,"type":11,"linkType":21},{"sys":296},{"type":11,"linkType":26,"id":47},{"name":49,"slug":50},{"createdAt":299,"id":300,"type":15},"2026-01-15T15:27:29.616Z","5rj9AuEsebufNWtBTlTu6F",{"fields":302,"sys":317},{"title":303,"slug":304,"category":305},"【Dart\u002FFlutter】とてもいい感じに末尾カンマを強制できるLintプラグインを作ったよ","better-require-trailing-commas",{"metadata":306,"sys":309,"fields":316},{"tags":307,"concepts":308},[],[],{"space":310,"id":39,"type":15,"createdAt":40,"updatedAt":40,"environment":312,"publishedVersion":43,"revision":44,"contentType":314,"locale":28},{"sys":311},{"type":11,"linkType":12,"id":13},{"sys":313},{"id":20,"type":11,"linkType":21},{"sys":315},{"type":11,"linkType":26,"id":47},{"name":49,"slug":50},{"createdAt":318,"id":319,"type":15},"2026-01-15T15:06:58.744Z","7DWX6Gej091IAM1nvGIaiw",{"Entry":321},[322],{"metadata":323,"sys":326,"fields":333},{"tags":324,"concepts":325},[],[],{"space":327,"id":39,"type":15,"createdAt":40,"updatedAt":40,"environment":329,"publishedVersion":43,"revision":44,"contentType":331,"locale":28},{"sys":328},{"type":11,"linkType":12,"id":13},{"sys":330},{"id":20,"type":11,"linkType":21},{"sys":332},{"type":11,"linkType":26,"id":47},{"name":49,"slug":50},1794573260374]