中堅プログラマーの備忘録

忘れっぽくなってきたので備忘録として・・・

【C#.net VB.net】フォーム外のクリックを取得する

1.概要

.netアプリケーションのマウスクリックイベントは
【Form】上のコントロールであれば容易に取得することが可能です。
ですがごくまれに【Form】外のマウスクリックを拾いたい時があります。
これを実現させるにはどうすればいいのでしょうか?
やはりこういうイレギュラーなことをするには
WindowsAPIを使う必要があります。
ですので今回は【WindowsAPI】の【GetAsyncKeyState】という関数を使用します。

2.GetAsyncKeyStateとは

特定のキーがどういう状態になっているかを返してくれます。
今回はクリックをしたかどうかを知りたいので
【Keys.LButton】の状態を確認します。
戻り値はint型、Integer型となり【0】以外であれば
クリックされたと判断するようにコードを記述します。

3.スクリプト

フォームに【Timer1】と【Label1】を貼り付けています。
【Timer1】の【Interval】は100msにしています。

Imports System.Runtime.InteropServices

Public Class Form1

    <DllImport("user32.dll")>
    Public Shared Function GetAsyncKeyState(ByVal vKey As System.Windows.Forms.Keys) As Short
    End Function

    Dim flgClick As Boolean = False
    Dim count As Integer = 0

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        If GetAsyncKeyState(Keys.LButton) <> 0 Then
            If flgClick = False Then
                count += 1
                Label1.Text = count.ToString()
                flgClick = True
            End If
        Else
            flgClick = False
        End If
    End Sub
End Class

using System.Runtime.InteropServices;

public partial class Form1 : Form
    {
        [DllImport("user32.dll")]
        public static extern short GetAsyncKeyState(System.Windows.Forms.Keys vKey);

        bool flgClick = false;
        int count = 0;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (GetAsyncKeyState(Keys.LButton) != 0)
            {
                if (flgClick == false)
                {
                    count++;
                    label1.Text = count.ToString();
                    flgClick = true;
                }
            }else
            {
                flgClick = false;
            }
        }
    }

4.結果

実行すると、クリックするたびに【Label1】の値がカウントアップされます。

f:id:tsu--kun:20190619135801p:plain