かもブログ

かもかも(@kam0_2)の雑記。地理やITに関するにわか稚拙センテンスの掃き溜め。

Windowsに社会的距離を強制させるアプリを作った話とその他

Windowsに社会的距離を強制させるアプリを作った話

 流行りに乗って、こんなものを作ってみた。

f:id:two_headed_duck:20200507222242p:plain
このようなタイトルバーが。。。

f:id:two_headed_duck:20200507222335p:plain
ソーシャルディスタンスを保つ!!

実行しているすべてのアプリケーションのタイトルバーに社会的距離を維持させるジョークソフトです。

遊び方

  1. ここからアプリケーションをダウンロードして起動します。
    f:id:two_headed_duck:20200507222517p:plain
    真ん中のボタンでOn/Offを切り替えられます。
  2. 真ん中のボタンを押すと動作します。実行されているアプリケーション、これから実行するアプリケーションの全てに影響を及ぼします。
  3. アンインストールはアプリケーションを削除するだけで終了します。

注意点

  • Windowsが不安定になることがあります。
  • 一部のアプリケーション(e.g. メモ帳)ではタイトルバーが変わりません。
  • タイトルバー以外のボタンなども変わることがあるようです。
  • ライセンスはMITです。使用にあたって発生した損害の責任を作者は負いかねます。

ソース

github.com

その他

どうでもいいい話

f:id:two_headed_duck:20200507223324p:plain
伺か(Materia-B)
 伺か(Materia-B)には「キャプションいじり」という機能があるんですね。これを始めてみたときはおったまげたわけですよ。任意のアプリケーションのタイトルバーが改変されて、面白おかしい文章になってしまうんですね。
 んで、そもそもどんな技術でそんなことができんのか気になったわけです。それでやってみました。難しくないし簡単でびっくりしちゃった。

Win32API

 大昔、C言語Windowsフォームを作っていた頃(今も現役かもしれないが)はWin32APIと呼ばれるものを呼び出して、ウィンドウやらボタンやらを作っていたわけです。(Win32API自体はグラフィックのみならず、I/O等様々な機能がありますが、)これらは"C:\Windows\System32\"下にある”***32.dll”がその正体で、Cの場合はwindows.hというラッパーを通じて、GUIを作ることになります。C#などで.NETを用いてGUIを作る場合も.NETがWin32APIのラッパーをしているだけであり、根底ではすべてWin32APIがGUIを構成しています。はい。
 で、このWin32API、ウインドウ1つに対して固有の「ウインドウハンドル(hwnd)」という値を割り振るんです。APIの関数に対して、このハンドルを渡して、ボタンを置きたいウインドウを指定したりします。多分。詳しく知りません。*1
 このウインドウハンドルさえあれば、他のアプリケーションのウインドウを好き放題操作可能なんです。AアプリのウインドウにBアプリからタイトルを書き換えることができてしまう。で、ハンドルは簡単に取得できます。ハンドルの一覧を取得するAPIがあります。
 どうやら昔から、他のアプリをいじるはマナー違反ということで、「禁止」ではなかったようなのです。とどのつまり、Windowsってよくわかんないねってお話でした。

 C#からWin32APIを呼ぶ場合はDLLをインポートしてラッパーメソッドを自力実装する必要があるのですが、ネットには神サイトが有りすでにラッパーメソッドが公開されています。

https://www.pinvoke.net/

神です。

*1:ウインドウメッセージとかもあるし本当に詳しく知りません