概要
DisplayPortスリープ問題とやらに有効な策が取れずにいたので、自作アプリで対処しました。
本文
アプリ概要
- Windowsフォームアプリ
- saveボタンを押すと、ウィンドウ情報を保存する
- restoreボタンを押すと、save時と位置情報が違う場合は復元する
起動時
save時
復元候補をずらっと表示します。プロセス名とウィンドウタイトルを出してます。
restore時
ウィンドウ位置・サイズが変わっていた場合は復元を試みて、行末に結果を付加しています。
既知の未解決問題点
- 管理者権限で動いているウィンドウを復元するには、アプリも管理者権限じゃないとだめみたいです。(当然といえば当然なんでしょうか)
- 一部のアプリは復元できないようです。私の愛用しているアプリに「壁カレ」というのがあるのですが、これは復元に失敗します。ウィンドウの形態が特殊なのでそのせいだとは思いますが、できれば復元できるようにしたいところです。
- 単独exeファイルで動くようにしたいのですが、そのようなビルド設定をしても、うまくいかずにいます・・・自分で使う分には別にいいのですが、ほかの人の需要があるかもしれないなどと妄想すると少し残念です。
- 起動している覚えがないのに、復元候補に電卓が出てきます。たいした問題ではないですがもやもやします。
ソースコード
今後
WindowsUpdateで根本解決したら、このコードは無用になります。
そうなるまでは、未解決問題点を改良できればなーとか思ってます。
思ったように動くかわからないまま書いたのでテストコードどころじゃなかったです。拡張するならテストコードとかちゃんと整備したいです。
単一exeファイルにできれば知り合いとかに使ってみてもらうとかありえそうなので、そこをなんとかしたいです。
チラシの裏
デビュー作です
WindowsFormアプリ初めて作りました。
コンソールアプリでもよかったんですけど、フォームにウィンドウ情報覚えさせておくのが楽かなと思ってこうなりました。
ポエムな開発経緯
- DisplayPortスリープ問題は今後のWindowsUpdateで解決される問題らしい
- が、それがいつになるかわからないし、そもそも私の環境はDisplayPortじゃなくてHDMIなので、ほんとに解決するかも疑わしい
- ウィンドウ位置復元のフリーソフトは探すと見つかるけど、探した限りでは「仮想デスクトップ未対応」と来た
- じゃあ自分で何とかするか・・・?と、仮想デスクトップ対応をどうするかという視点で、雑に探してみる
- 「仮想デスクトップ」という単語だと99.9%リモートのVDIでヒットしてしまい、むきー。となる
- apiとかそのへんのキーワードを加えて、[SylphyHorn](https://www.microsoft.com/ja-jp/p/sylphyhorn/9nblggh58t01? activetab=pivot:overviewtab) 作者さまの VirtualDesktop を見つける
- おお、これを使えば仮想デスクトップ対応のウィンドウ位置復元ができるのね?と思い込む
- 幸いC#は一応書ける
- インストールなしで動くVSCODEでなんとかしようと思い立ってみる
- VirtualDesktopがapp.manifest設定やらデバッグなし実行が必要やらで、うんともすんとも動かない
- manifestやらなんやら試してみたけどうまくいかず、諦めてVisualStudio Communityをインストール
- VirtualDesktopはあっさり動いた。
- VSCODEはあくまでエディタで、素人がどうにかできるとは思うなってことか・・・
- 想像では、VirtualDesktopの機能で、
getVirtualDesktops().foreach(getWindows())
みたいな感じで仮想デスクトップごとにアプリ情報を取っていく・・・のだと思っていた- が、そんな機能は見当たらなかった(最初に見とけって話か・・・)
- ぐぐりながら「ウィンドウすべてを取得」をしてみて、「それを保存」「それを復元」してみた
- やってみたところ、仮想デスクトップとか関係なしに復元できてしまった
- (公開されているウィンドウ復元ソフトが仮想デスクトップ非対応なのは何故・・・?)
- そんな疑問を残しつつ、自分の要求は、VirtualDesktopを使わずとも古来の機能で満たせるらしい
- ひとまず自分は少し幸せになれた