/w10wm

c# tiling window manager for windows10

Primary LanguageC#GNU General Public License v2.0GPL-2.0

w10wm ( windows10 window (tiling) manager)

このアプリケーション開発の経緯(読み飛ばしてくださって結構です)

はじめて bug.n(https://github.com/fuhsjr00/bug.n) を使ったとき、私は衝撃を受けました。 キーボードだけでウィンドウを整理し、アクティヴなウィンドウを移動するというその操作感に、一気に魅了されました。 なぜなら Alt + Tab や Win + Tab でアクティヴなウィンドウを切り替える作業に、どうもストレスを感じていたからです。

bug.n は、Alt + Tab なんかよりずっと、「次に自分がフォーカスしたいウィンドウに意図したとおり切り替えられる」のが本当に素敵でした。

しかし...どうもうまく使いこなせませんでした。細かいことは省きますが、使いたいのに、設定が難しくて、どうすれば意図したとおりになるのかわからない。 解決するために bug.n のソースを読んでみたりしましたが、挫折しました。

結果、bug.n を使うのをやめてしまいましたが、その操作感だけは忘れられず、似たアプリケーションがないか探し回りました。 ウィンドウをタイル表示するアプリケーションはたくさんありましたが、 ショートカットキーでウィンドウを管理するアプリケーションはついに見つけられず、 「自分で(自分が必要な機能だけ)作ってみよう」と思い立って作ったのが w10wm です。

私はもはや Windows OS では 10 しか使っておらず、この先 7 や 8、Vista などを使う予定もありませんので、ターゲットは Windows 10 だけです。

標準の Win + → でのモニター移動や Win + L でのロックもよく使うので、こういったものは極力生かします。 その上で、モニターごとにウィンドウの整理方法を設定でき、整理された中でアクティヴウィンドウを上下移動したり、 またはフォーカスを上下移動するアプリケーションを作ることにしました。

私は普段はPHP, Python, JavaScriptなどで開発する、いわゆるサーバー系開発者でありまして、 デスクトップアプリケーションの開発は新人時代に Visual Studio 6 で VB を使って以来です。

どうせなら、と思いすべて初めての C# で作りました。winapi を使うのもほとんど初めてです。 本当はソースコードを晒すのは恥ずかしいのですが、むしろさらけ出したほうが誰かが有用なことを教えてくれるかな、 という逆に甘えた気持ちで OSS ライセンスにしています。 自由な改変をしていただいていいのですが、どう改変したのか後学のために知りたい(こともある気がする)ので GPL v2.0 にしました。

キーの押下とウィンドウの表示をフックさえできれば作れるだろう、という甘い気持ちではじめましたが、 意図したように動くようになるまでには、やはりそれなりの試行錯誤がありました。

今でもなにかバグがあったりするに違いない。

基本コンセプト

  • モニターごとにウィンドウの整列方法を指定できます。ウィンドウを新しく開くとその整列方法に基づいて自動的に整列します。
  • アクティヴウィンドウが青く?他のウィンドウより目立って表示されるのは Windows10 標準のとおりです。
  • アクティヴウィンドウから別のウィンドウにフォーカスを移動するとき、Win + j, k で上下移動できます
  • ウィンドウの並び順が気に入らない場合は、アクティヴウィンドウの位置を上下に移動できます。Win + Shift + j, k です。
  • アクティヴウィンドウが存在するモニターがアクティヴモニターです。
  • アクティヴモニターを左右に移動したい場合は、Win + . や Win + , で移動できます。
  • アクティヴモニターを移動すると、移動先のモニターにある最後にアクティヴだったウィンドウがアクティヴウィンドウになります。
  • マウスを使って他のモニターの他のウィンドウをアクティヴにしても大丈夫です。
  • Windows10 のみで動作確認しており、他の Windows OS のサポート予定は全くありません
  • Windows10 の標準ショートカットキーは基本的に生かしています。
  • 標準ショートカットキーのうち、いらないでしょ、と私がおもったものは本アプリケーションで使ったりしています。(たとえばコルタナさんが起動するWin+Cとか)

前提

  • 起動すると無言でタスクトレイに居座ります
  • メニューバーがない特殊なウィンドウや、表示されないウィンドウは本アプリケーションの管理下におきません。
  • いまのところ UWP アプリケーションは管理下におかないほうがよさそう(WindowLongの値が普通のアプリケーションとは違っていてよくわからないから)だったので、除外しています
  • Win + o でコンテクストメニューが表示されるようにしてありますが、そこでのキー入力がきかなくなることがあります(フォーカスが失われている?のかよく原因がわかっていません)
  • 設定画面はありませんが、w10wm.exe.Config というのが設定ファイルです。設定ファイルの内容を反映するには、 w10wm を一度終了して再度起動しなおしてください。
  • だいぶ減りましたが、例外が発生するとダイアログなどなしに無言でいなくなります(Win+jとかが効かなくなるので気づきます)
  • バグはあるはず
  • .Net Framework 4.8 で作っています。Windows のバージョンが Windows 10 May 2019 Update あたり以降であればおそらくインストール済です。

ショートカットキー(Windows10 標準)

  • Winキー + Shift + → : アクティヴウィンドウを右モニターに移動
  • Winキー + Shift + ← : アクティヴウィンドウを左モニターに移動
  • Winキー + Ctl + → : 次の仮想デスクトップを表示
  • Winキー + Ctl + → : 前の仮想デスクトップを表示
  • Winキー + → : アクティヴウィンドウをアクティヴモニター内で右寄せする?モニター移動もするみたい
  • Winキー + ← : アクティヴウィンドウをアクティヴモニター内で左寄せする?モニター移動もするみたい

追加した機能

モニター操作

  • Winキー + F1 : 番号1のモニターをアクティヴにする(アクティヴモニターをハイライトする)

  • Winキー + F2 : 番号2のモニターをアクティヴにする(アクティヴモニターをハイライトする)

  • Winキー + F3 : 番号3のモニターをアクティヴにする(アクティヴモニターをハイライトする)

  • Winキー + c : アクティヴモニターを一瞬ハイライト表示する

  • Winキー + . : 次のモニターをアクティヴにする(アクティヴモニターをハイライトする)

  • Winキー + , : 前のモニターをアクティヴにする(アクティヴモニターをハイライトする)

ウィンドウ操作

  • Winキー + j : 現在のアクティヴモニター内でアクティヴウィンドウのひとつ下のウィンドウにフォーカスを移動

  • Winキー + k : 現在のアクティヴモニター内でアクティヴウィンドウのひとつ上のウィンドウにフォーカスを移動

  • Winキー + u : 現在のアクティヴモニター内で一番上のウィンドウにフォーカスを移動

  • Winキー + m : 現在のアクティヴモニター内で一番下のウィンドウにフォーカスを移動

  • Winキー + Sift + j : 現在のアクティヴモニター内でアクティヴウィンドウをひとつ上に移動

  • Winキー + Sift + k : 現在のアクティヴモニター内でアクティヴウィンドウをひとつ下に移動

  • Winキー + Sift + u : 現在のアクティヴモニター内でアクティヴウィンドウを一番上に移動

  • Winキー + Sift + m : 現在のアクティヴモニター内でアクティヴウィンドウを一番下に移動

その他

  • Winキー + o : コンテクストメニューを表示

    • Win + o , t , x : 現在のアクティヴモニター内の全てのウィンドウを全画面表示する

    • Win + o , t , f : 現在のアクティヴモニター内の全てのウィンドウを4分割表示する

    • Win + o , t , t : 現在のアクティヴモニター内の全てのウィンドウをBug.n風タイル表示する

    • Win + o , t , m : 現在のアクティヴモニター内の全てのウィンドウを通常画面表示する(MDI的な)

    • Win + o , r : 現在のアクティヴモニターのすべてのウィンドウを再整理

    • Win + o , w , x : 現在のアクティヴウィンドウを最大化

    • Win + o , w , n : 現在のアクティヴウィンドウを最小化(次にフォーカスがあたると元のあるべき位置に戻る)

    • Win + o , - , e : 現在のアクティヴウィンドウの実行ファイル名を、常に本アプリケーションの管理対象外とする

    • Win + o , - , t : 現在のアクティヴウィンドウのウィンドウタイトルを、常に本アプリケーションの管理対象外とする

    • Win + o , q : 本アプリケーションを終了

    • Win + o , x : コンテクストメニューを閉じる

  • Win + ? でキーボードショートカットを一覧表示する

次に追加したい機能

  • Winキー + h : 現在のアクティヴウィンドウをハイライト表示

  • Winキー + Shift + F1 : アクティヴウィンドウを番号1のモニターに移動

  • Winキー + Shift + F2 : アクティヴウィンドウを番号2のモニターに移動

  • Winキー + Shift + F3 : アクティヴウィンドウを番号3のモニターに移動

  • Winキー + Shift + . : アクティヴウィンドウを右のモニターに移動

  • Winキー + Shift + , : アクティヴウィンドウを左のモニターに移動

  • 次のウィンドウに任意のキーコンビネーションを送る(これはAutoHotKeyで実現できるのでいらない?)

  • Win + j, k, u, m あたりもコンテクストメニューに追加する?

  • 現在のアクティヴモニターの全ウィンドウを最大化、最小化する(Win+Dは全モニターの全ウィンドウを最小化、戻すするがモニターごとに行いたい?)

  • モニターハイライト機能の動きがあやしいのを直したい(連打すると特に怪しい)

  • 通常時はログの出力を少し減らしたい

将来追加したい機能

  • Winキー + Shift + 1~9 : 現在のアクティヴウィンドウを仮想デスクトップ1~9に移動

  • Winキー + Shift + Ctl + 1~9 : 現在のアクティヴモニター内の全てのウィンドウを、仮想デスクトップ1~9に移動

  • Winキー + Ctl + → (?) : (タイル表示モードのみ)右側の枠を少し広げる

  • Winキー + Ctl + ← (?) : (タイル表示モードのみ)右側の枠を少し狭める

  • Winキー + Tab : 現在のアクティヴモニター内のウィンドウのみで Alt + Tab 的な表示をしたい

  • 起動時に Hello 表示

  • Winキー + タブ : 現在のアクティヴディスプレー内のウィンドウでAlt+Tabできる感じ(オリジナルのWin+Tabは無効になる)

  • 追加機能として、好みのアプリケーションを好みのホットキーにわりあて、起動/切り替えを行えるようにする (Win + Ctl + E で Excel を起動、Excelが起動していれば Excel をアクティヴにする、的な)