Top / JUNK / マウスの横にタイマーを表示

(1) グローバルフックを行います。

「C#にてマウスとキーボードを操りし者」
[https://qiita.com/exliko/items/3135e4413a6da067b35d]
から HouseHook.cs をコピー

(2) タイマーを表示するウィンドウを作成します。

・背景は透明
・TopMost
・ShowInTaskbar は False。
・経過時間は現在時刻から開始時刻を差し引いて求めます。

using System;
using System.Drawing;
using System.Windows.Forms;
using MMFrame.Windows.GlobalHook;

namespace WindowsFormsApp1
{
    internal class TimerWindow : Form
    {
        DateTime startTme;
        readonly Timer timer;
        private string pastTime;

        public TimerWindow() {
            FormBorderStyle = FormBorderStyle.None;
            TransparencyKey = BackColor;
            DoubleBuffered = true;
            TopMost = true;
            ShowInTaskbar = false;
            // タイマー設定
            timer = new Timer();
            timer.Interval = 100;
            timer.Tick += Timer_Tick;
        }

        protected override void SetVisibleCore(bool value) {
            if (value) {
                // 表示開始
                startTme = DateTime.Now;
                MouseHook.Start();
                MouseHook.AddEvent(new MouseHook.HookHandler(Handler));
                pastTime = string.Empty;
                timer.Start();
            } else {
                // 表示終了
                MouseHook.Stop();
                timer.Stop();
            }
            base.SetVisibleCore(value);
        }

        protected override void OnFormClosed(FormClosedEventArgs e) {
            base.OnFormClosed(e);
            // フック終了
            if (MouseHook.IsHooking) {
                MouseHook.Stop();
            }
            // タイマー解除
            timer.Stop();
        }

        private void Handler(ref MouseHook.StateMouse state) {
            SetProperties();
        }

        private void Timer_Tick(object sender, EventArgs e) {
            SetProperties();
        }

        private void SetProperties() {
            var pos = Control.MousePosition;
            Location = new Point(pos.X + 32, pos.Y);
            TimeSpan span = DateTime.Now - startTme;
            PastTime = $"{span.Minutes:00}:{span.Seconds:00}";
        }

        public string PastTime {
            get {
                return pastTime;
            }
            set {
                if (PastTime != value) {
                    pastTime = value;
                    if (IsHandleCreated) {
                        Invalidate();
                    }
                }
            }
        }

        protected override void OnPaint(PaintEventArgs e) {
            base.OnPaint(e);
            using (var b = new SolidBrush(BackColor)) {
                e.Graphics.FillRectangle(b, ClientRectangle);
            }
            TextRenderer.DrawText(e.Graphics, PastTime, this.Font, Point.Empty, ForeColor);
        }
    }
}

(3) 使ってみる

using System;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        readonly TimerWindow timerWindow = new TimerWindow();

        public Form1() {
            InitializeComponent();
        }

        private void Button1_Click(object sender, EventArgs e) {
            timerWindow.Visible = !timerWindow.Visible;
        }
    }
}

timerCursor.png



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2019-08-01 (木) 22:03:52 (17d)