名称未定っぽい。
2024-01-22T00:27:32+09:00
lordnoesis
日記っぽかったり、チラシの裏っぽかったり。通称POI。
Excite Blog
L.Nにメッセージを送りたい方はこちら。
http://poimono.exblog.jp/14513082/
2999-01-01T00:00:00+09:00
2023-01-07T21:37:23+09:00
2010-06-03T15:28:17+09:00
lordnoesis
Web
AutoHotkey v1で、アクティブなウィンドウに対応するスクリプトを自動起動/終了するようにしてみた
http://poimono.exblog.jp/33202115/
2023-12-25T18:07:00+09:00
2024-01-06T09:47:05+09:00
2023-12-25T12:22:09+09:00
lordnoesis
テクノロジ
c:\windows\notepad.exe.ahk
偶に使うアプリや、クリアしたらおしまいなゲーム等で便利。ジョイパッドのボタン(Joy1~32)をホットキーにするとCPUリソースドカ食いすることがあるので、被害を最小限に抑えられる。 ウィンドウ切り替わりイベント(と終了イベント)をフックしてるので応用が利く。勝手にアクティブになってしまうブラウザを押さえつけるとか。 pBuf := RegisterCallback("cbWinEvent")
DllCall("SetWinEventHook", "uint", 0x0003, "uint", 0x0003, "uint", 0, "ptr", pBuf, "uint", 0, "uint", 0, "uint", 0, "uint", 0)
DllCall("SetWinEventHook", "uint", 0x8001, "uint", 0x8001, "uint", 0, "ptr", pBuf, "uint", 0, "uint", 0, "uint", 0, "uint", 0)
pBuf := ""
return
cbWinEvent(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime) {
static oHwndAHK := {}
switch event
{
case 0x0003: { ; アクティブウィンドウ切り替え
evForeground(hwnd, oHwndAHK)
}
case 0x8001: { ; オブジェクト破棄
if (0 == idObject) ; 破棄されたのがウィンドウなら
evObjDestroy(hwnd, oHwndAHK)
}
}
}
evObjDestroy(hwnd, oHwndAHK) {
if !oHwndAHK.HasKey(hwnd)
return
if oHwndAHK[hwnd].path {
if hwnd2 := WinExist("ahk_exe " SubStr(oHwndAHK[hwnd].path, 1, -4)) {
evForeground(hwnd2, oHwndAHK) ; 他のウィンドウが生きてれば託す
} else {
DetectHiddenWindows, On
WinClose, % oHwndAHK[hwnd].path " ahk_class AutoHotkey"
}
}
oHwndAHK.Delete(hwnd)
}
evForeground(hwnd, oHwndAHK) {
if (!oHwndAHK.HasKey(hwnd)) {
WinGet, ProcPath, ProcessPath, A
if FileExist(ProcPath ".ahk") {
oHwndAHK[hwnd] := {path: ProcPath ".ahk", TickDelay: 0}
} else {
oHwndAHK[hwnd] := ""
return
}
}
if (oHwndAHK[hwnd].path && A_TickCount >= oHwndAHK[hwnd].TickDelay) {
DetectHiddenWindows, On
If !WinExist(oHwndAHK[hwnd].path " ahk_class AutoHotkey") {
oHwndAHK[hwnd].TickDelay := 2000 + A_TickCount
Run, % A_AhkPath " """ oHwndAHK[hwnd].path """"
}
}
}]]>
AutoHotKeyで、マウス速度を一時的に変更してみた。
http://poimono.exblog.jp/32719010/
2022-08-27T20:15:00+09:00
2022-11-03T13:14:49+09:00
2022-08-27T20:16:00+09:00
lordnoesis
未分類
SPI_GETMOUSESPEED := 0x70
SPI_SETMOUSESPEED := 0x71
; DllCall("SystemParametersInfo", "UInt", SPI_GETMOUSESPEED, "UInt", 0, "UIntP", OrigMouseSpeed, "UInt", 0); 現在値取得
DllCall("SystemParametersInfo", "UInt", SPI_SETMOUSESPEED, "UInt", 0, "Ptr", 1, "UInt", 0); 1に
KeyWait, LAlt
DllCall("SystemParametersInfo", "UInt", SPI_SETMOUSESPEED, "UInt", 0, "Ptr", 20, "UInt", 0); 20に(決め打ちが嫌なら上で取得してここで戻す)
return 他のキー(Appsとか)でもいいが、CtrlとShiftはお勧めできない。GUIで複数選択する時によくやるので。 ちなみにマウス加速度の編集は「マウスポインタの加速調整ツール for XP」が便利。プリセット3で、低速域をちょっと傾斜上げてる。早すぎと感じても使ってる内に慣れる人体凄い。]]>
OxygenNotIncludedで、Shoebox boilerを作った備忘録。
http://poimono.exblog.jp/32709424/
2022-08-16T22:53:00+09:00
2023-01-06T21:04:06+09:00
2022-08-16T22:53:56+09:00
lordnoesis
ゲーム・ホビー
]]>
AutoHotKeyで、Everything DLLを利用してみた。
http://poimono.exblog.jp/32592745/
2022-05-19T20:39:00+09:00
2022-05-28T17:21:40+09:00
2022-05-19T20:39:46+09:00
lordnoesis
テクノロジ
DLLは公式DLページのEverything SDK内にある。関数はSDKのドキュメントに。なお別途Everythingが動いている必要がある。 SetWorkingDir %A_ScriptDir%
searchStr := "test ext:txt"
hModule := DllCall("LoadLibrary", "Str","Everything64.dll", "Ptr")
VarSetCapacity(resBuf, 65534) ; NTFSのPATH最大長*2(UTF-16)
DllCall("Everything64.dll\Everything_SetSearch", "Str",searchStr) ; クエリ発行
DllCall("Everything64.dll\Everything_Query", "Int",1) ; 実行
resNum:=DllCall("Everything64.dll\Everything_GetNumResults") ; 結果の総数を取得
hEv_GRFP := DllCall("GetProcAddress", "Ptr", hModule, "AStr", "Everything_GetResultFullPathNameW", "Ptr") ; 関数アドレス取得
res := ""
Loop, %resNum%
{
DllCall(hEv_GRFP, "int",A_Index - 1, "str",resBuf, "int",32767) ; 結果をひとつ取得
res .= resBuf "`n"
}
MsgBox, % res
DllCall("FreeLibrary", "Ptr", hModule) GetProcAddress
でEverything_GetResultFullPathName
が見つからなくて困ってたらEverything_GetResultFullPathNameW
だった、という備忘録。ちゃんとdumpbinとかDLL Export Viewerで見なきゃダメね……。まあ、そもそも普通に呼んでも早いので高速化してるのかわからん。]]>
Class_SQLiteDB.ahkでBLOB扱ってみた。
http://poimono.exblog.jp/32399397/
2021-12-04T23:35:00+09:00
2024-01-22T00:27:32+09:00
2021-12-04T23:35:16+09:00
lordnoesis
テクノロジ
とりあえず、てきとーにファイルをDBに保存して、他所で変数に展開してみる。
BlobArray := [{Addr:&BinBuf, Size:BinSize}]
SQL := "INSERT INTO BinTable (Path,Size,Bin) VALUES ('" Path "'," BinSize ",?1) ON CONFLICT(Path) DO UPDATE SET Path='" Path "', Size=" BinSize ", Bin=?1;"
DB.StoreBLOB(SQL, BlobArray)
SQL := "SELECT * FROM BinTable WHERE Path='" Path "';"
DB.Query(SQL, RecordSet)
RecordSet.Next(Row)
BinSize := Row[3].Size
VarSetCapacity(BinBuf, BinSize)
p := Row[3].GetAddress("Blob")
DllCall("RtlMoveMemory", UInt,&BinBuf, UInt,p, UInt,BinSize) そのまま取得すると文字列扱いで途切れるのでメモリコピー。普段はGetTable()使ってるのだが、RecordSet.NextしかBlobに対応してないっぽいのでQuery()。]]>
TweetDeckの横スクロールバーを太くすると便利。
http://poimono.exblog.jp/32258626/
2021-08-08T18:02:00+09:00
2021-08-08T18:02:42+09:00
2021-08-08T18:02:42+09:00
lordnoesis
テクノロジ
height: 2.5em;
}]]>
Genki ShadowCastで、より遅延減らしたりステレオにしたり。
http://poimono.exblog.jp/32116515/
2021-05-02T21:40:00+09:00
2022-04-21T21:08:08+09:00
2021-05-02T21:40:29+09:00
lordnoesis
テクノロジ
用途は「ゲーム機の映像を低遅延でPCに表示」の他、「AV機器の出力をPCで視聴」「デジイチをWebカムとして使う」「サーバーの映像出力をノートPCで確認する」等。NintendoSwitchのドックに収まるくらい小型だが、PS4等は筐体と干渉して刺さらないのでHDMI延長ケーブル/アダプタが必要。 主要チップはMS2109で、いわゆる中華キャプチャと同じだがハードウェア遅延は半分程(60ms)らしい。
入力は4kまで対応、出力は最大1080p/30fps、720p/60fps。表記ゆれで1080p/60fpsと書いてある箇所もあるが、出ないっぽい。中華キャプチャでは「入力がFHD入力なら30fpsだが、4kだと60fps」という怪現象があるらしいが……。ちなみにHDCPでも問題ない。保護とは……。
オーディオは疑似モノラルなので、ステレオ化できる(後述)。 映像はUVC対応ソフトで表示するのだが、WindowsとMac向けにGenkiArcadeという専用ソフトがある。モダンブラウザでブラウザ版にアクセスすることで、LinuxやAndroidでも表示できる。iPadはUVCに対応してないので無理。
ただし、GenkiArcade ver.1.2は少々遅延があり、音声もモノラル。お勧めは、より低遅延で表示できる「mpv」。 ver.1.5はストアアプリになり、遅延が改善された。音声は相変わらずモノラル。録画は使ってないのでわからん(Windows/mac)。 GenkiArcadeやmpvのウィンドウを非アクティブにするとカクつく現象があったが、グラフィックドライバの設定の問題だった。 OBSで映像キャプチャデバイスにShadowCastを登録してバッファリング無効にするのが一番簡単かもしれん。 mpvでShadowCastの映像を表示するには、起動時にコマンドラインオプションをつける。例えば"mpv.exe av://dshow:video="ShadowCast" --profile=low-latency --untimed --framedrop=no --speed=2"
画質を犠牲に低遅延で60fps出すなら"mpv.exe --demuxer-lavf-o=video_size=720x480 av://dshow:video="ShadowCast" --profile=low-latency --video-aspect-override=16:9 --framedrop=no --speed=2"
ウィンドウをいじるなら" --title="ShadowCast - mpv" --geometry=50%:1 --window-scale=0.69"あたり。 GenkiArcade以外の場合、音声を聞くには別途操作が必要になる。
ひとつめは、Windowsの標準機能を使う方法で、お手軽だがモノラル。コントロールパネルのサウンド(mmsys.cpl)を開き、録音>デジタル オーディオ インターフェイス (ShadowCast)
のプロパティで聴く>このデバイスを聴く
にチェックを入れるだけだ。
もうひとつは「mono-to-stereo」を使う方法で、導入と起動の必要があるがステレオ化できる。使い方はDLしてコマンドプロンプトでmono-to-stereo.exe -?
すれば書いてあるが、要約すると--list-devices
でオーディオデバイス名を調べて、コマンドラインオプションで--in-device
と--out-device
に指定すればいい。例えば"mono-to-stereo.exe --in-device "デジタル オーディオ インターフェイス (ShadowCast)""
MS2109は、実際には48kHzステレオの音声を、96kHzモノラルにして出力しているらしい。 なお、映像や音声が出ない場合、USBケーブルを抜き差しすると直る。チラつきの場合は接触不良っぽい……?]]>
AHKSoundToDevicePlayer(playsound.exe)の依存関係エラーを解決した。
http://poimono.exblog.jp/32102977/
2021-04-23T23:52:00+09:00
2021-04-23T23:58:35+09:00
2021-04-23T23:52:48+09:00
lordnoesis
テクノロジ
Windowsを遠隔操作するなら「とりあえずChromeリモートデスクトップ」でよさげ。
http://poimono.exblog.jp/31912386/
2020-12-26T18:07:00+09:00
2020-12-27T00:45:30+09:00
2020-12-26T18:07:39+09:00
lordnoesis
テクノロジ
ブラウザ版には「クリップボード同期」「Ctrl+Alt+Del送信」「キーマッピング」「トラックパッド風操作/直接タッチ操作」「全モニタ合成/任意モニタ表示」「音声転送」「ファイルの送受信」「機能キー完備のソフトウェアキーボード」といった機能がそろっている。 特に評価したいのが任意モニタ表示で、映像転送を特定モニタに限定するとFPSが上がるリッチな作り。なんなら動画も見れる。音声同期の優先度は低いらしく、転送負荷が高いと音声が先行しがち。セッションのオプションで「ウィンドウに合わせる」と「ウィンドウに合わせてサイズ変更」をONにすると転送負荷がかなり下がる。 速度制限(128kbps)状態だと映像が一切映らないし、ファイルの送受信はスマホ側でツリーを辿れるTeamViewerの方が使いやすいし、RD ClientはWindowsがクラッシュしかけの状態でも操作できる可能性があるし、通信量を絞りたいならMirror-DTC(シェアウェア)が最強だが、一般的には「とりあえずChromeリモートデスクトップ」で済む。]]>
ImageMagickで、タスクトレイ用アイコンを半自動生成するBat書いた。
http://poimono.exblog.jp/31910699/
2020-12-25T18:03:00+09:00
2020-12-25T18:05:23+09:00
2020-12-25T18:03:08+09:00
lordnoesis
テクノロジ
setlocal
set FONT="Comic-Sans-MS-Bold"
set SIZE=20
set /P STR="アイコンに表示する文字は? "
set /P STR2="ファイル名は? "
magick -size 32x32 xc:none -draw "roundrectangle 0,0 31,31 2,2" -size 32x32 -define gradient:center=0,0 -define gradient:radii=32,32 radial-gradient:lightgreen-darkgreen -font %FONT% -fill white -pointsize %SIZE% -gravity center -interline-spacing -14 -stroke black -strokewidth 2 -annotate +0-2 "%STR%" -stroke none -annotate +1-1 "%STR%" -compose src_in -composite !icon_%STR2%.ico
endlocal タスクトレイ(16×16)だとフォントサイズはこの辺が下限だと思う。大文字2文字しか表示できないけど。一応、TE \n ST
みたいに入力すれば段組みもできなくはない。
まあわざわざこのためだけにImageMagick入れることはないと思う。Portable版が環境汚さなくて好き。]]>
任意のショートカットファイルを削除しにくくする。
http://poimono.exblog.jp/31907662/
2020-12-23T20:59:00+09:00
2020-12-24T18:25:00+09:00
2020-12-23T20:59:56+09:00
lordnoesis
テクノロジ
単純に「アクセス許可」で削除を禁止できればよいのだが、アクセス許可は所有者やら所属グループやらが干渉しあい複雑怪奇。というわけで、簡単かつ確実にワンクッション置くためのメモ。 まずショートカットを「読み取り専用」に。そしてセキュリティ > 詳細設定
で、自身のアクセス許可の高度なアクセス許可 > 属性の書き込み
を非チェックに。なお、アクセス許可が編集できない場合は継承の無効化
をする。
これだけで、ショートカットを削除する際に権限要求のダイアログが表示されるようになる。管理者は「続行」できてしまうが、ミス防止なのでワンクッションあれば十分だろう。]]>
AutoHotKeyで、任意のオーディオデバイスから音声を鳴らしたい。
http://poimono.exblog.jp/31906177/
2020-12-22T21:41:00+09:00
2021-05-11T21:19:24+09:00
2020-12-22T21:41:47+09:00
lordnoesis
テクノロジ
普段使ってるのでMPC-BEにしたが、別のプレーヤーでもいいと思う。コマンドラインでデバイス指定ができるなら。PlaySound(FilePath, DeviceNum:=0, WaitSW:=0) {
cmd := """mpc-be64.exe"" /play /close /new /audiorenderer " DeviceNum " """ FilePath """"
if WaitSW
RunWait, %cmd%, , Hide, PID
else
Run, %cmd%, , Hide, PID
return PID
}
自動再生、自動終了、強制新規プロセス、オーディオデバイス指定できるのほんと助かる……。 MPC-BEはオプション>再生>再生>再生
を"0回"にしていると自動再生されないのだが、/Playスイッチより優先度が高いので注意。結果的に/Closeも無意味。"連続再生"等にしておいて、自動再生したくない場合だけ/Openスイッチを使うのがよい。 あと前回終了時の音量を引き継ぐのも注意。プロセス間通信使って音量を上げる手もあるっちゃある。]]>
Chrome拡張「Web Server for Chrome」が便利。
http://poimono.exblog.jp/31520716/
2020-07-23T19:13:00+09:00
2023-04-10T22:46:10+09:00
2020-07-23T19:13:17+09:00
lordnoesis
未分類
TablacusExplorer拡張「filtercolor_bk」を、アイコン背景色変化に改造してみた。
http://poimono.exblog.jp/31518244/
2020-07-22T20:09:00+09:00
2020-07-22T20:26:31+09:00
2020-07-22T20:09:08+09:00
lordnoesis
テクノロジ
しかし欲を言えばColorLabelsのようにアイコン背景色を変えたい……というわけで、filtercolor_bkを改造してみた。ひとさまのをちょっと触っただけなのでdiff!--- script.js
+++ script.js
@@ -22,7 +22,24 @@
var path = pid[Addons.FilterColor_BK.Mode];
for (var i = Addons.FilterColor_BK.List.length; i--;) {
if (PathMatchEx(path, Addons.FilterColor_BK.List[i][0])) {
- vcd.clrTextBk = Addons.FilterColor_BK.List[i][1];
+// こっから
+ let cl = Addons.FilterColor_BK.List[i][1];
+
+ let brush = api.CreateSolidBrush(cl);
+ api.FillRect(nmcd.hdc, nmcd.rc, brush); // アイコン背景色
+ api.DeleteObject(brush);
+
+ let rgb = [
+ (cl & 0xff0000) >> 16,
+ (cl & 0xff00) >> 8,
+ (cl & 0xff)
+ ];
+ vcd.clrTextBk = cl; // 文字背景色
+ if (vcd.clrText == GetSysColor(COLOR_WINDOWTEXT)) {
+ cl = rgb[0] * 0.299 + rgb[1] * 0.587 + rgb[2] * 0.114; // 輝度
+ vcd.clrText = cl > 127 ? 0 : 0xffffff; // 文字色
+ }
+// ここまで
return S_OK;
}
} てかRGB分解するくだり要らんな! ColorLabelsのコピペでいいよな……。
余分な機能がついてるver.
--- script.js
+++ script.js
@@ -22,7 +22,43 @@
var path = pid[Addons.FilterColor_BK.Mode];
for (var i = Addons.FilterColor_BK.List.length; i--;) {
if (PathMatchEx(path, Addons.FilterColor_BK.List[i][0])) {
- vcd.clrTextBk = Addons.FilterColor_BK.List[i][1];
+// こっから
+ let cl = Addons.FilterColor_BK.List[i][1];
+
+ let brush = api.CreateSolidBrush(cl);
+ api.FillRect(nmcd.hdc, nmcd.rc, brush); // アイコン背景色
+ api.DeleteObject(brush);
+
+ let rgb = [
+ (cl & 0xff0000) >> 16,
+ (cl & 0xff00) >> 8,
+ (cl & 0xff)
+ ];
+ // 文字色変化
+ let clFlu = 0x0; // 元の背景色に対する変化量
+ rgb[0] = 256 > (rgb[0] + clFlu)
+ ? 1 > (rgb[0] + clFlu)
+ ? 0
+ :rgb[0] + clFlu
+ : 255;
+ rgb[1] = 256 > (rgb[1] + clFlu)
+ ? 1 > (rgb[1] + clFlu)
+ ? 0
+ :rgb[1] + clFlu
+ : 255;
+ rgb[2] = 256 > (rgb[2] + clFlu)
+ ? 1 > (rgb[2] + clFlu)
+ ? 0
+ :rgb[2] + clFlu
+ : 255;
+ cl = (rgb[0] << 16) + (rgb[1] << 8) + rgb[2];
+
+ vcd.clrTextBk = cl; // 文字背景色
+ if (vcd.clrText == GetSysColor(COLOR_WINDOWTEXT)) {
+ cl = rgb[0] * 0.299 + rgb[1] * 0.587 + rgb[2] * 0.114; // 輝度
+ vcd.clrText = cl > 127 ? 0 : 0xffffff; // 文字色
+ }
+// ここまで
return S_OK;
}
} なぜ通常版で無駄にRGB分解してたのか、それは、変化させる機能がついてたから! 要らんな!! てかこれ、なんなんだろJScript? JavaScriptすらよくわからないので、とにかくわからない。三項演算子のあたりもっとスマートにできそうな気もするが、動いてるしまあいっか!]]>
https://www.excite.co.jp/
https://www.exblog.jp/
https://ssl2.excite.co.jp/