◆ Evernote がタスクトレイから復元されない(異常に遅い)
◆ 再起動すれば高速
◆ タスクトレイにしまったら自動でプロセスを kill する

背景

Evernote の不具合のせいで色々困らされて脱 Evernote しようとしてるのですが 問題点が発覚しました
ある端末とデータを共有してる手段が Evernote で そこには自由にソフトを入れられないので 今のところ Evernote を使うしか共有手段はありません
なので 普段のメモは Evernote ではないのですが Evernote を消すに消せない状態です

別に消さなくてもいいのですが問題は相変わらずのバグです
しかも Windows 7 の PC でしか起きないもので 今では Windows 7 はサポート切れなので直る見込みはほぼ無いでしょう
そのバグというのはウィンドウを閉じてタスクトレイに移動したあとに復元できなくなるというもの
昔はそんなことなかったのですが いつの頃からそうなってもう数年です

新しく OS を再インストールした PC でも発生し Evernote の再インストールや DB の再構築でも改善しなかったのでこれはもう諦めてます
アカウントのデータ側に問題があってウィンドウを復元するときに内部でやってる処理が終わらない可能性も考えましたが Windows 10 の PC では問題ないですし 仮にそうだとしたら対処しようがないです

タスクトレイから復元できないだけで再起動すれば一瞬で使えるようになるので 再起動さえすれば問題なしです
しかし再起動も毎回となると面倒です
タスクトレイからアイコンを右クリックして終了を押すだけならまだいいのですがこれも反応してくれません
一応ときどきは反応します
復元できないや反応しないというのは正確に言うと「動かない」ではなく「異常に遅い」というもので待ってたら数分~数十分後にウィンドウが表示されたり終了したりします
さすがにそんな時間も待ってられないのでタスクマネージャから強制終了というのがいつもの手順です

Evernote 開くたびにタスクマネージャから一回強制終了
やってられません
オプションで×ボタンで閉じたときにタスクトレイにいれずにアプリを終了することができればよかったのですが 見た感じそれもなさそうでした
これまでは耐えてきましたがさすがにストレスが溜まってきたのでそろそろ楽にしようと思います

方法

簡単なのが bat ファイルに taskkill と Evernote の起動を書いておいて Evernote の起動をこれで行う方法です
ただ bat ファイルはアイコンがわかりづらいし 起動方法とかはいつもと変わらずのほうがいいです

起動したいときに終了+起動するのじゃなくても 普段から×ボタンでウィンドウを閉じたときに完全に終了してくれればいいので 自動で強制終了させようと思います
Windows のメッセージフックとか使えばそういうことできそうですが あまり詳しくない上に複雑なことはしたくないので 定期的にプロセス確認する方法にしました
Evernote プロセスがあり そのプロセスのメインウィンドウがない状態=タスクトレイにしまわれてる ということなのでその状態を検知したらプロセスを kill します

定期的なチェックの間隔を短くすれば ほぼ×ボタン押したときに完全に終了してるのと一緒なので 毎回の起動はウィンドウの復元じゃなくて新規起動になって快適になるというものです

コード

言語は C# にしました
Python は Windows 10 の PC の WSL にしか入ってないし Node.js は Windows 固有のことするのが結構面倒そうだったので……

dotnet new console でプロジェクト作ったら Program クラスをこれにします

class Program
{
static int Interval = 1000 * 60;

static void Main(string[] args)
{
while (true)
{
System.Threading.Thread.Sleep(Interval);
var killed = CheckAndKill();
if (killed)
{
System.Console.WriteLine("killed");
}
else
{
System.Console.WriteLine("no process");
}
}
}

static bool CheckAndKill()
{
foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
{
if (p.ProcessName == "Evernote" && (int)p.MainWindowHandle == 0)
{
p.Kill();
return true;
}
}
return false;
}
}

毎分チェックするようにしてます

このままだとコンソールプログラムなのでコマンドプロンプトのウィンドウが出ます
バックグラウンドで実行するには csproj の OutputType を Exe から Winexe にすれば可能です

タスクトレイ

EvernoteTray.exe というプログラムもあってこれがタスクトレイに入るもので異なるプロセスになっています
こっちも終了してもよかったのですが あえて残しておくことにしました
こうするとタスクトレイには Evernote アイコンが残っていて これをクリックすることで起動できるので起動しやすいです
ただ メインのプロセスを強制的に kill してるので一旦不正終了のメッセージが出てきます
邪魔ですが エラーを送信しますか? の確認でキャンセルするだけでいいので こっちのほうが使いやすいと判断しました