追記

野良犬日記 2.1

RDF/RSS
この日記の検索

最近のツッコミ:


2024-03-12 (Tue) [長年日記]

_ [ahk]Windows の不思議セキュリティ、あるいは頑固な UWP のなだめ方

 TL;DR
 本当に always-on-top にしたければ
 その実行ファイルは
 UIAccess の諸条件をクリアしなければいけない

AutoHotkey で Always-on-top に設定した Gui を作って表示したところ、 一部のウィンドウの上には表示されず、隠れてしまうという現象が起こった。 (その「一部」が UWP アプリであることは後から分かった。)

再現条件が複雑で、

  • AHK スクリプトとして実行するなら再現しない (問題の UWP アプリの上に表示できる)
  • Ahk2Exe でコンパイルすると再現する (UWP の上に表示できない)
  • いや、スクリプトでも再現するマシンと再現しないマシンがある

と、かなり迷走した。

AHK に関係のない他のウィンドウで試してみると、

  • タスクマネージャーは再現しない (件の UWP アプリ上に表示できる)
  • LibreOffice とか Firefox とかでは再現する (UWP の上に表示できない)

ということが分かった。

そんなことないと思う人は試してみてほしい。 複数モニタがあれば、一つに Windows 標準の「映画 & テレビ」で何かの動画をフルスクリーン再生して (一時停止しておいてもいい)、そこに別のモニタからのウィンドウを移動していくとどうなるか。

タスクマネージャーを移動していくと何事もなく重なるのに、 普通のウィンドウを重ねようとすると、途中までは下に潜りこむような感じで隠れていて、ある程度まで来ると「映画 & テレビ」の方が消えてしまうのだ。

タスクマネージャーはすごく変なアプリだから特別なのかもしれないと思ったが、AutoHotkey 付属の Window Spy もタスクマネージャーと同じ結果になった。というか AutoHotkey が C:\Program Files にインストールされているマシンでは AHK スクリプトから UWP の上に表示できるみたいだ。同じ AHK スクリプトを実行して UWP に隠れてしまう方のマシンには AutoHotkey をインストールしておらず、zip を展開した状態で使っていた。

ここに来てやっと分かった。Ahk2Exe してあるかどうかというより、UIAccess 権限があるかどうかが問題だったのだ。

それまで権限の問題と思えなかった理由は、「管理者として実行」をしても現象が変わらなかったからだ。AutoHotkey のドキュメントでも、UAC の問題は UIAccess と管理者権限のどちらでも解消できると書いてある。https://www.autohotkey.com/docs/v2/FAQ.htm#uac これは少し誤解を招く文かもしれない。

というわけで結論として、UWP の中でもさらに特殊な条件を含めた really-always-on-top を実現するためには、UIAccess が必要である。WinSetAlwaysOnTop の remarks にも書いておいてほしい気がする。

UIAccess のための条件

もっと良い方法もあるのか?

最後のリンク https://learn.microsoft.com/en-us/windows/win32/winauto/uiauto-securityoverview#uiaccess-requirements-for-assistive-technology-applications には

 UIAccess should not be used:
   By applications that are not assistive technologies.
   By assistive technology applications that display information or UI that is not relevant to the accessibility scenario they target.
   By applications that just want to appear above other applications in the new Windows UI.

と書いてある。まさに今回のことを言っているようだ。こんな場合は UIAccess を使うべきではない! とだけ書かれても、どうすればいいのか分からない。


2024-02-22 (Thu) [長年日記]

_ windows の stdin て面倒

   fopen_s(&f, "testfile.bin", "wb");
   for (unsigned char i = 0; i < 256; ++i) {
       fputc(i, f);
   }
   fclose(f);

で出力したファイルを fread すると普通に 7F の次は 80 になるのに、pwsh から

 Get-Content testfile.bin | program.exe

みたいにパイプして stdin を fread すると 7F の次が EF BF BD と 3 バイトに膨れる。

あ、その前に 1A のところで EOF と思って止まってしまうので

 _setmode(_fileno(stdin), _O_BINARY);

とかいうものも必要。(stdin の freopen はできない?)

で、80 が EF BF BD になる問題。

最初は 80 が EF になるのかと思って、キャストすれば直る? とか思ったけど、よく見ると EF じゃなくて EF BF BD になっているので、signedness とかより、エンコーディング関係の問題に見える。

結論としては、pwsh の Get-Content が勝手にテキストとして処理しているのが悪かったので、

 Get-Content -AsByteStream testfile.bin | program.exe

なら問題なかった。

他のプログラムからのバイナリデータはどうなるのかは未確認。

windows の微妙に portable にならない部分が気持ち悪いのは前からだけど、pwsh も罠だらけだ。(標準 powershell や古い pwsh と pwsh7.4 でそれぞれ違ったりする)


2024-01-21 (Sun) [長年日記]

_ [ahk] Ahk2Exe の github action

毎度 yaml 書くの面倒なので https://github.com/tamo/action-Ahk2Exe にまとめた


2024-01-01 (Mon) [長年日記]

_ [js]はてブのコメントもマウスホバーで見たい

YouTube コメントをホバーで一覧するやつ

https://github.com/tamo/yt-comments-popup/compare/v1.2.4...hatena

適当に b.hatena.ne.jp で動くようにした


2023-12-31 (Sun) [長年日記]

_ [ahk] Windows のストアアプリ実体位置など

https://www.sordum.org/16360/ というのがあるそうだけどソースがないので怖くて実行できずにいるので、自分で書いた

gist から github repo へ

最初は gist にしていたんだけど、履歴が見えづらいし gitkraken から無料では使えないみたいだし画像以外の添付ファイルもできないので普通に github 扱いにしたくなって

git remote add 適当な名前 https://github.com/tamo/新規repo
git push 適当な名前 main

で流しこんだ。


2002|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|10|11|12|
2011|02|04|05|06|07|08|09|10|11|12|
2012|01|03|04|05|06|09|11|12|
2013|02|03|09|10|11|
2014|02|03|04|06|09|
2015|11|
2016|01|04|09|10|
2017|04|05|07|
2018|04|08|12|
2019|07|08|10|
2020|04|05|06|07|08|
2021|01|02|07|
2022|05|06|07|08|10|
2023|06|10|11|12|
2024|01|02|03|