■97974 |
Re[7]: WndProcによるマウス押下状態取得 |
□投稿者/ 魔界の仮面弁士 -(2021/08/15(Sun) 10:36:13)
| ■No97972 (プログラマー さん) に返信 >>MouseEventArgs のメンバーの e.Button ではなく、Control.MouseButtons という Control クラスのスタティック(Shared)プロパティです。 > MouseUpイベントが発生しないので、上記リファレンス通りの書き方をしても正常に動作しませんでした。
MouseUp イベントを使う必要があるなどとは、誰も言っていませんよ。
もちろん MouseDown や MouesUp 中でも利用できますが、 No97965 でも書かれているように、いつでもどのタイミングでも利用できます。 たとえば WndProc 中や Timer_Tick あるいは Button_Click や PictureBox_Paint でも呼び出せます。
'Left, Middle, Right, XButton1, XButton2 Dim leftButtonPressing As Boolean = MouseButtons.HasFlag(MouseButtons.Left)
この System.Windows.Forms.Control クラスの MouseButtons プロパティとは 内部的には GetKeyState API を呼び出すだけの処理です。
これと既に紹介されている GetAsyncKeyState API との違いですが、 GetKeyState が、Windows Message 取得時のキー入力状態を取得するものであるのに対し、 GetAsyncKeyState が、IRQ (ハードウェア割り込み)レベルでのキー取得となっています。
ほとんどの場合は MouseButtons で事足りるとは思いますが、高負荷状態などで メッセージループを捌き切れていない状態(それは大抵、作りこみがマズイという ことでもあるのですが)の場合、MouseButtons では期待する結果が得られないかもしれません。
仮に MouseButtons で拾えないケースにおいても、GetAsyncKeyState であれば、 現在のマウスボタンやキーボード状態を得ることができるでしょう。宣言例はこちら。 http://kchon.blog111.fc2.com/blog-entry-137.html https://www.chuken-engineer.com/entry/2019/06/20/000247
この時、マウスボタンを表す定数値として Public Const VK_LBUTTON As Integer = 1 '← No97965 にて紹介済み Public Const VK_RBUTTON As Integer = 2 Public Const VK_MBUTTON As Integer = 4 Public Const VK_XBUTTON1 As Integer = 5 Public Const VK_XBUTTON2 As Integer = 6 を利用できますが、これらは同値が System.Windows.Forms.Keys 列挙体として Keys.LButton Keys.RButton Keys.MButton Keys.XButton1 Keys.XButton2 として定義済みのため、あえて定数を切りなおさずとも、これらを利用して呼び出すこともできます。
ただしこうした呼び出しは、セキュリティ系のソフトによって検出されやすくなります。
たとえば Timer 等で常時監視するような操作は、危険性のあるソフトウェア(たとえばキーロガーなど)と 誤解されてしまい、ブロックや駆除対象になりえます。その点は注意が必要でしょう。 |
|