を含む特定の行で奇妙な問題が発生していGetKeyState
ます。Visual Basic 2010 のフォーム外で Windows スタート ボタンのマウスの左クリックを検出しようとしています。特定の 1 行は成功に非常に近いですが、何かが間違っています。以下、具体的な情報。
Public Class Form1
Public Declare Function GetKeyState Lib "user32" (ByVal vKey As Integer) As Short
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If GetKeyState(91) < 0 And GetKeyState(1) < 0 Then
MsgBox("Start Button clicked.")
End If
End Sub
End Class
行を変更すると:
If GetKeyState(91) < 0 And GetKeyState(1) < 0 Then
に:
If GetKeyState(91) < 0 Then
キーボードのみを使用して、フォームの外側で [スタート] ボタンをクリックすることで、MsgBox をトリガーできます。スタートボタンをマウスでクリックしても反応がありません。
同じ行を次のように変更すると:
If GetKeyState(1) < 0 Then
マウスの左ボタンをクリックすることで MsgBox をトリガーできます - フォームの外、OS のどこでも。
ただし、スタートボタンの左クリックとして解釈されると思われるものを組み合わせようとすると、次のようになります。
If GetKeyState(91) < 0 And GetKeyState(1) < 0 Then
何も起こりません。マウスがスタートボタンを左クリックしたときに MsgBox がトリガーされるようにするにはどうすればよいですか?
----------------------------------質問の補足-------------- --------------------------
キーボードのキーと画面のボタンの違いがわかりました。Windows キーはスタート ボタンをトリガーしますが、GetKeyState はキーボードからの入力しか受け付けません。名前からすると、GetKeyState はキーボード上のキーの状態のみに関係しているように見えます。ただし、キーボードとマウスの両方を使用する GetKeyState 関数がオンラインで多数見られます。
しかし、GetKeyState では目的地に到達できないと結論付けなければなりません。Window Detective と呼ばれる Spy++ に似たプログラムを実行したところ、スタート ボタンが親: Shell_traywnd および子: Button として識別されました。
したがって、次のようなものを作成するように思えます。
myParent = FindWindow(vbNullString, "Shell_traywnd") myChild = FindWindowEx(myParent, 0, "ボタン", vbNullString)
問題は、子がクリックされたかどうかをどのように検出するかです。この場合、スタート ボタンはハンドルと呼ばれますか? それとも窓?また、X / Yを使用してマウスの位置を知っていますが、Windows OSではスタートボタンを自由に再配置できるため、それを使用したくありません。