まだウィンドウの移動で消耗してるの？　ウィンドウ管理を超効率化するアプリを作ってみた。

# はじめに
皆さんはモニターどのように使っていますか？
自分はできる限りモニターを余すところなく使いたい&最小限の操作でウィンドウの移動を行いたいのですが

Windowsデフォルトのスナップ機能では

- 1:1でスナップされるので毎回調整が必要
- 頻繁にスナップが外れる
- 比率の調整が面倒
- マウスでの移動量が多い


という不満があり、他のソフトウェアでも微妙に欲しい機能を持ったものが見つかりませんでした。


そこで最小限のマウス操作でウィンドウを配置、調節できるWindows用のアプリを素人ながら作ってみました。





個人的にはもうこれなしでは生きられないほど便利です。

https://github.com/hamhamburger/EasyWindowSnapper


# デモ
カーソルの下にあるウィンドウを左右にスナップし比率を調整
![dac46485-73b2-4d1a-bf1a-bb73d097be77 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802626/e43e63ab-c35d-8e7d-9940-30b9893e70ce.gif)



ウィンドウ選択画面から直接ウィンドウをスナップ→不要なウィンドウを削除
![4e5397ab-4a1e-4ad8-a9d3-5c3508ebe51e.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802626/21497833-d026-7df6-a829-4b1c9f9ac303.gif)


# 操作方法

| 操作 | 戻るボタンを押しながら | 進むボタンを押しながら |
|---|---|---|
| ホイール | ウィンドウの比率を調整 | ウィンドウを選択 |
| 左クリック | 左にスナップ | 選択したウィンドウを左にスナップ |
| 右クリック | 右にスナップ | 選択したウィンドウを右にスナップ |
| 中クリック (デフォルト) | 左右のウィンドウを入れ替え | 選択したウィンドウを閉じる |
| 中クリック (変更可能) | カーソルの下のウィンドウを最大化<br>カーソルの下のウィンドウを最小化<br>カーソルの下のウィンドウを閉じる | 選択したウィンドウを最大化<br>選択したウィンドウを最小化<br>選択したウィンドウを閉じる |!





# 設定方法
タスクトレイの青いモニターのアイコンを右クリックすると設定と終了ができます。

設定画面では
●中ボタンクリックの動作
●ホイールでの比率調整の単位
●デフォルトでは何対何でスナップするか
●ウィンドウ一覧画面のサイズ
●ウィンドウ一覧画面で表示しないウィンドウ
●リサイズを最適化するアプリのクラス

などを設定できます。




# このアプリの良いところ

### AltTabライクなウィンドウ一覧画面から直接スナップできる

これがとても気に入っています。
選択したウィンドウを左右にスナップするだけでなく閉じたり最大化したりもできるので、マウスから使える高機能なAltTabの代替としても使えます。

標準のAltTabはモニターごとにウィンドウを区別してくれませんが、このアプリはカーソルの置かれているモニターのウィンドウのみを表示するようにしています。

### 操作が簡単(無駄な移動がない)

基本的にはウィンドウ選択からスナップして戻る＋ホイールで比率調整という流れです。
カーソルを無駄に動かしたり、比率を調整するためにウィンドウとウィンドウの狭い部分にカーソルを合わせる必要はありません。

### 細かい気が利く

挙動の細かい解説は省きますが
このアプリでは単にウィンドウを左右に移動するだけでなく、


移動したウィンドウの下にあったウィンドウも「いい感じ」に調整し、
左に移動した場合は右のウィンドウも「いい感じ」に調整し、
スナップしたウィンドウをこのアプリから最小化したり閉じた場合には
その下にあるウィンドウを「いい感じ」にスナップします。

要するに適当に使っても常にウィンドウが左右にスナップしている状態をキープしてくれます。
もちろん最大化などすればそちらが優先されます。


# 悪いところ


### 全員が使いやすいとは限らない

モニターを二分割して使うためのアプリであり、
三分割したり四分割したりすることはできないため、大きすぎるモニターには向かないかもしれません。
そういう方にはDisplayFusionなどがおすすめです。


これは個人的な意見ですが、通常の開発業務であれば38インチ以上のモニターに三分割してウィンドウを配置するより

34インチのウルトラワイド＋24インチぐらいのサブモニターという構成で
エディタとブラウザなどメインのウィンドウをウルトラワイドに、
設計図などのサブウィンドウをサブモニターに配置

仮想デスクトップにチャットやメール、フロントとバックエンドそれぞれの開発などを割り当て切り替えながら使うのが最強だと思います。

仮想デスクトップの切り替えはマウスのチルトに割り当てるのがおすすめです。

### ウィンドウの比率を調整する機能が一部のアプリに対して重い
エクスプローラー、動画編集アプリ、ゲームなどはサイズ変更の処理が重いため少し固まってしまったり
メモリが少ない場合には警告音が出ることがあります。

~~将来的に設定したアプリケーションはサイズ変更の確定時(戻るボタンを離したとき)までレンダリングを行わないようにできる機能を付けたいと思っています。~~

2023/07/20　実装しました。




### キーボードショートカットを用意していない

自分はトラックボール付きのキーボードを使っており、キーボードをマウスとして使えるので単純に必要ありませんでした。
もし需要があれば追加します。

# 既知の不具合

- 極稀にウィンドウの比率調整やを連続で行った場合に進むボタン/戻るボタンが押しっぱなしになることがあります。
押しっぱなしになってしまっているボタンを一度押せば治ります。

- 一覧表示画面でウィンドウを閉じても表示が残るウィンドウがあります。
Windowsデフォルトのメールアプリはウィンドウ一覧画面で閉じても表示が残ります。

- クリックが効かなくなることがある。過去のバージョンで発生していた不具合ですが、フォーカスが奪われ全てのウィンドウに対してクリックが効かなくなることがあります。
発生した場合はCtrl+Alt+Deleteを押せば治ります。

# その他注意点

このアプリでは戻るボタンと進むボタンをキーボードのブラウザバックで置き換えています。
戻る/進むを単体で押した場合は通常通り戻る/進むの動作をしますが、VSCodeではそのままでは使えません。
Go Forwardと Go BackのショートカットをBrowser BackとBrowser Forwardに変更してください。


# 最後に
慣れればウィンドウの操作をかなり効率化できるのでぜひ試して頂きたいです。


ちなみにこのアプリはほぼChatGPT製です。
プロンプトを意識せずとも質問を関数や機能単位で分割していけば、
C#,Windows Form,Windows API全て初めてでもちゃんと動くものができました。

本当に良い時代ですね。



# 更新
Chromeなどブラウザベースのアプリはリサイズの処理が最適化されていますが、エクスプローラーなど一部のアプリはリサイズの処理が重く、ホイール操作で全体が遅くなってしまうという問題がありました。

そこで、設定したクラスのアプリケーションは以下のように変更確定時までレンダリングを行わないようにする機能を追加しました。

追加したい場合はレンダリングを抑制したいアプリのクラスを設定画面で登録してください。

クラスはAHKのwindow spyなどで取得できます。



![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802626/ca95a62c-a401-8392-039f-ab1be8fde042.gif)

#### 追記
エクスプローラーのリサイズが重かったのはエクスプローラー自体の不具合のようです。
今は修正されています。