ユーザーが特定のオブジェクトをクリックしたかどうかを確認する方法はわかっていますが、ユーザーがどこをクリックしたかは気にせず、クリックしたかどうか(実際のフォームかオブジェクトか)を知る必要があります。または何でも)。私のコードはこれです:
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
If GetAsyncKeyState(1) Then
Label1.Text = "Left"
Else
Label1.Text = "Right"
End If
End Sub
コードを実行すると、エラーが発生します。
PInvokeStackImbalanceが検出されました
「PInvoke関数 'Mouse click!Mouse_click.Form1 :: GetAsyncKeyState'の呼び出しにより、スタックのバランスが崩れました。これは、マネージPInvokeシグネチャがアンマネージターゲットシグネチャと一致しないことが原因である可能性があります。PInvokeシグネチャの呼び出し規則とパラメーターが一致することを確認してくださいターゲットのアンマネージド署名。」
私はvb.netに非常に慣れていないので、ドキュメントは本当に役に立ちません。どんな助けでも素晴らしいでしょう:)
これを実際に行うにはいくつかの方法があり、それはあなたが何を達成しようとしているのかによって異なります。1つの方法は、すべてのクリックイベントをルーティングする特定の場所を用意することです。
Public Sub ClickHandler(sender As Object, e As MouseEventArgs) Handles Me.MouseClick, PictureBox1.MouseClick, Label1.MouseClick, Button1.MouseClick
Label1.Text = String.Format("Clicked ""{0}"" with the {1} mouse button.", sender.name, e.Button.ToString.ToLower)
End Sub
このサブが処理するすべてのイベントに注意してください。また、どのボタンが押されたかを確認したい場合は、次のようなことができる場合があります。
Select Case e.Button
Case MouseButtons.Left
Label1.Text = "Left"
Case MouseButtons.Right
Label1.Text = "Right"
Case MouseButtons.Middle
Label1.Text = "Middle"
Case Else
Label1.Text = "Some other button"
End Select
繰り返しになりますが、これは1つの方法にすぎず、コントロールが満載の大規模なアプリや、あらゆるアプリケーションでの作業にはあまり実用的ではありません。そのようなものはより複雑になり、システム全体のフックが必要になる場合があります。
[編集]:
ロビンがコメントした内容(ちなみに、優れた提案)に沿って、すべてのコントロールを前もって含める必要がないように、別のコード行にハンドラーを追加することもできます。実際、私が本当に気に入っているこの方法に従った場合は、フォームの各コントロールでループを使用してこれを行うことができます。
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
For Each c As Control In Controls
AddHandler c.MouseClick, AddressOf ClickHandler
Next
End Sub
Private Sub ClickHandler(sender As Object, e As MouseEventArgs) Handles Me.MouseClick
Label1.Text = String.Format("Clicked ""{0}"" with the {1} mouse button.", sender.name, e.Button.ToString.ToLower)
Select Case e.Button
Case MouseButtons.Left
Label2.Text = "Left"
Case MouseButtons.Right
Label2.Text = "Right"
Case MouseButtons.Middle
Label2.Text = "Middle"
Case Else
Label2.Text = "Some other button"
End Select
End Sub
それをありがとう、ロビン!完全に私の心を逃れた...
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加