テレワーク時のスクリーンセーバーと戦う


背景

昨今のコロナ禍の時代、テレワーク(リモートワーク、在宅勤務)をする方が増えていると思いますが、テレワーク用に支給されたPCのスペックが低くイライラされている人が多いと聞きました。

そのため、調べごとやプログラミングの動作確認・デバッグを自宅にある自分の PC でこっそりやる方もいると思うのですが、支給されたPCで一定時間操作していないとスクリーンセーバーになり毎回ログインが面倒、または操作ログを取られており未操作だとサボリとみなされるなど "IT 後進国日本" を肌で感じている方も少なくないと思います。

そこで今回はスクリーンセーバーとの戦い方を執筆したいと思います。

1. Windows の設定で戦う

会社から貸与された PC ではこの方法はまず使えないと思います。
レジストリ弄ったり無理に設定を変えることも不可能ではないと思うのですが、バレて更に怒られるリスクを考えるとスマートではありません。

2. プログラムで戦う

VB.NET や C# でマウス(またはキーボード)を動かして戦う戦略です。
私は以下のプログラムを C# で書いて見ましたが、スクリーンセーバーを無効にすることができませんでした...。(プログラムが悪い?)

        }
namespace WpfApp2
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            Timer timer = new Timer(2000);
            timer.Elapsed += (sender, e) =>
            {
                var pt = GetMousePosition();
                SetPosition((int)pt.X + 100, (int)pt.Y);
                pt = GetMousePosition();
                System.Threading.Thread.Sleep(1000);
                SetPosition((int)pt.X - 100, (int)pt.Y);
            };

            timer.Start();
            
        }

        [DllImport("User32.dll")]
        private static extern bool SetCursorPos(int X, int Y);

        public static void SetPosition(int a, int b)
        {
            SetCursorPos(a, b);
        }

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static extern bool GetCursorPos(ref Win32Point pt);

        [StructLayout(LayoutKind.Sequential)]
        internal struct Win32Point
        {
            public Int32 X;
            public Int32 Y;
        };
        public static Point GetMousePosition()
        {
            Win32Point w32Mouse = new Win32Point();
            GetCursorPos(ref w32Mouse);
            return new Point(w32Mouse.X, w32Mouse.Y);
        }
}

戦うことができませんでしたが、少しだけ補足

  • GUI アプリケーションの起動と同時にプログラムが動作
  • マウスを一定間隔で左右に移動する
  • 動きの幅をなくしたい場合は以下のようにする
    {
        Timer timer = new Timer(2000);
        timer.Elapsed += (sender, e) =>
        {
            var pt = GetMousePosition();
            SetPosition((int)pt.X + 1, (int)pt.Y);
            pt = GetMousePosition();
            SetPosition((int)pt.X - 1, (int)pt.Y);
        };
        timer.Start();
    }
    

3. ハードウェアで戦う

既製品を購入する

以下のような製品を購入する。
深くは調べていませんが他にも類似品があると思われます。

  • FLINT スクリーンセーバーキラー【忍者】

https://akiba-pc.watch.impress.co.jp/docs/news/news/1280383.html

  • USB Mouse Jiggler

https://www.amazon.co.jp/dp/B07MTF9WCH

こちらでは紹介していませんが、ヤフオク でも個人で制作している方が販売していたりします。

キットを買って自作して戦う

こちらについても深く調べてはいませんが他にも製品はありそうです。

  • KKHMF Digispark Kickstarter ATTINY85 USB 超小型開発ボードArduino互換

https://www.amazon.co.jp/dp/B01LYX88DM

クリップや洗濯バサミで戦う

ローテクにして、ローコスト。
原点にして、頂点です。

例えば 100 均のスマホスタンド用クリップを挟んで対応などもできると思います。