・はじめに
私のPC環境がwindows Homeで、EFSを使用できない。
しかし、私にも見られたくない恥ずかしいものの一つや二つは持っている。
そこで「アプリがないなら作ればいいじゃない」(マリー○○トワネット風)
という考えからアプリを作成した。
まず最初に開発環境から。
・環境
-Visual Studio 2022
-C#
-WinForms(.NET6)
このアプリは複数ウィンドウを使い分けて閲覧するウィンドウを変更し、心理的安全性と機能性をできる限りとどめたままでいかにも"隠しフォルダ”っぽい感じを出せるようにした。
裏で動き続けることで特定のコマンド入力によりいつでも起動でき、かつPCに負荷がかかりすぎないようにする。さらに起動後に2段階認証をすることで隠しフォルダとしての機能と“いかにも”な感じを出せるようにした。
裏から起動する際にはちゃんとアンロック画面から出るようにするなどの工夫を施すことでいちいちマウスでボタンをクリックする手間を減らし、快適な使用感を得られるようにした。
・安全性
このアプリはエクスプローラーのAppData内に新規フォルダを作成し、そこにアクセスすることで内容を閲覧する方式をとっている。
そのため、本気で探されたりタスクマネージャーでアプリの動作は確認されてしまうのだが、ただの一般人が親や知人にふとした瞬間に見られてしまうのを防ぐには十分な性能だろう。
※暗号化等はしていないため「心理的セキュリティ」にとどまることを留意しておいてほしい
・技術的内容
1.AppData内の”疑似的非表示フォルダ”を作成
HomeではEFSが使えないため、通常のユーザーは触らないであろうディレクトリにフォルダを作成し、フォルダ属性をHiddenに設定している。
<!--
メインフォームを隠す
-->
this.Hide();
<!--HiddenLaunchForm を作って待機させる(既にあるなら再利用)-->
if (Program.hiddenForm == null || Program.hiddenForm.IsDisposed)
Program.hiddenForm = new HiddenLaunchForm();
Program.hiddenForm.Show();
2.バックグラウンド常駐処理(低負荷化)
隠しフォルダは
-メインフレームを隠して常駐
-イベントや簡易ホットキーで起動
という仕組みを使っている
public HiddenLaunchForm()
{
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
this.BackColor = Color.Black;
this.TransparencyKey = Color.Black;
this.TopMost = true;
this.ShowInTaskbar = false;
}
特殊キーは以下のように設定しており、ホットキーでいつでも裏から出てきて問題なく起動できるようにウィンドウ起動との紐づけを行っている。
[DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
this.AllowTransparency = true;
this.BackColor = Color.Black;
this.TransparencyKey = Color.Black;
<!--// Ctrl + Shift + L-->
RegisterHotKey(this.Handle, HOTKEY_ID, MOD_CONTROL | MOD_SHIFT, (uint)Keys.L);
}
これにより「いつでも呼び出される”隠しアプリ”感」と「ちゃんと隠してる感」を演出している。
3..複数ウィンドウによる簡易的セキュリティ
1.の状態(画面が隠れていてバックグラウンドで動いている状態)で、
2.で作成しているコマンド(Shift+CTRL+L)を入力すると、
if (m.Msg == WM_HOTKEY && m.WParam.ToInt32() == HOTKEY_ID)
{
this.Close();
using (var unlock = new UnlockForm())
{
var dr = unlock.ShowDialog();
if (dr == DialogResult.OK && unlock.SpecialKeyValidated)
{
// mainForm を表示させ、Form1 の ShowLoginOnly を呼ぶ
if (Program.mainForm != null &&
!Program.mainForm.IsDisposed)
{
Program.mainForm.BeginInvoke((Action)(() =>
{
Program.mainForm.ShowLoginOnly();
}));
}
else
{
this.Show();
}
}
else
{
// 再度 HiddenLaunchForm を表示して待機
this.Show();
}
}
}
これが呼び出され、このコードによってコマンド入力後にUnlockWindowをだして、パスワード入力を要求し、あっていればさらにUnlockFormに自分が設定したパスワードとIDを入力すれば晴れてフォルダを開けるという代物になっている。
最後に
このアプリの開発によって
-winformsの応用
-WindowsAPIの活用
-属性別のフォルダ非表示
-バックグラウンド処理
-UI/UXの工夫
などを学ぶことができた。
「小さなアプリでも技術的経験は大きい」
そう感じた開発経験だった。
もし、このアプリを使ってみたいと思う人がいてくれるのならぜひGitHubを確認してみてほしい。
また、使用感を教えてフィードバックをしてくれでもしたなら作者が泣いて喜び暴れまわることだろう。
GitHub: https://github.com/neo557/Invisible-Folder-Create-App