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】の値がカウントアップされます。