🖥️

C#のオープンソースでWindows アクティブウィンドウにくっつくソフトのサンプルっぽいのを作りました

2023/01/06に公開約2,600字

Windows11の最大化ボタンのところに出てくるような画面分割のアプリをWindows10でも動くやつで作ってみました。っぽい、だけなので、見た目の派手さは全くないです。

ActiveWindowControl

名前もそのままです。

GitHub

standard-software/ActiveWindowControl
https://github.com/standard-software/ActiveWindowControl

リリース版の場所にZIPで固めたexeファイルもおいてます。
ActiveWindowControl/Release at main · standard-software/ActiveWindowControl
https://github.com/standard-software/ActiveWindowControl/tree/main/Release

目的

シングルディスプレイとかマルチディスプレイで、ディスプレイのいろんな場所にいろんなサイズでWindowを移動させ配置させたかったので作りました。DisplayFusionってソフトっぽい機能です。

スクーンショット

背景はVSCodeですが、右上の最小化ボタンの隣にあって押すとメニューを表示するのがActiveWindowControlです。たいていのウィンドウにもくっつきます。




見た目のまんまのメニューに書かれた機能で動きます。メニューのルート位置は押しやすい場所なので代表的な機能をもってきています。

シングルモニターの場合はNext Monitor のメニューは消えます。スクリーンショットには写っていませんが3つ以上のモニターの場合は、Prev Monitor のメニューも表示されます。

使い方

オープンソースなので、Visual Studio Community 2022 を使ってビルドすることができます。
メニュー構成のカスタマイズや、ライトモードダークモードの切り替えのGUIは用意していません。日本語表記にしたいとか、そういう自分好みにカスタマイズしたい場合は、ビルドしなすとよいと思います。

アクティブウィンドウのハンドルに対して何かのAPIを呼び出す機能を追加するのは簡単なので、ウィンドウの透明度を変えたり、最前面にしたり、ウィンドウタイトルをコピーしたり、プロセスをもとめてフォルダを開いたりパスコピーしたり、などなどの改良を楽しむ事ができるような気がします。

リリースフォルダにはビルドしたバイナリもあるので、Visual Studio 2022を持ってない人でも使えます。

注意

ライトモード

MainForm.cs のここをコメントアウトするとライトモードになります。

    private void MainForm_Load(object sender, EventArgs e) {
:
      {
        ToolStripProfessionalRenderer renderer = new VS2022MenuRenderer();
        renderer.RoundedEdges = false;
        ToolStripManager.Renderer = renderer;
        ToolStripManager.VisualStylesEnabled = true;
      }

グローバルフックDLLとか

このようなアプリケーションを作る時は、グローバルフックを使用するのが定石のような気がしますが、DLLを作ったりあれやこれやする腕がないので、このActiveWindowControlでは、0.1秒のタイマーでActiveWindowを追跡しているだけです。なので若干カクカク感があります。

グローバルフック使ってもっとスムーズに動かすべきだ!と思われる方はオープンソースなので自分でそのように改良してください。てか、改良して作り方教えてください。

NextMonitor

別のモニターに移動して最大化するとき、いくつかのアプリではうまく動いてくれないものがあるようです。よくわかりません。誰か改良してください。

アクティブなウィンドウの切り替え時に少しチラチラする。

APIの呼び出し方が難しくて、ちらつかずに、親ウィンドウにのっかる、ということができませんでした。誰か改良してください。

Left Side と Right Side とかに配置すると、隙間があく。

DwmGetWindowAttributeに関係するMoveWindowAPIで素直に実装すると隙間が開きます。これを解消するやり方不明でした。あきらめて隙間があるまま使ってください。どこかの誰かが解消してくれないかな。と。初詣で神仏に願っているのできっと願いがかなうと思います。大吉でしたし。

電卓とかカレンダーとか

Windowsの新しいタイプのストアとかからダウンロードするやつは、親ウィンドウの指定がなんかうまくいかず、ウィンドウの裏に隠れてしまいます。(透明化ソフトをいれてるとわかる)
こちらも改善方法わからずなので、きっといつか誰かが改良してくれる事を願って。

リンク

先行してQuoraで公開してました。
https://qr.ae/prhNov

Discussion

ログインするとコメントできます