0

を含む特定の行で奇妙な問題が発生してい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ではスタートボタンを自由に再配置できるため、それを使用したくありません。

4

3 に答える 3

1

あなたの仮定は正しくありません: 91 (0x5B) の GetKeyState パラメーターは、画面のスタート ボタンではなく、キーボードの左の Windows キーを参照します。マウスのクリックが発生する場所を確認する必要があると思います。

私はこれについて専門家ではありませんが、Visual Studio に付属の Spy++ を使用して、[スタート] ボタンのクリックに関連する Windows メッセージを確認できます。

于 2012-09-11T02:30:00.480 に答える
-1

論理的な「または」を試しましたか?

 If GetKeyState(91) < 0 Or GetKeyState(1) < 0 Then
        MsgBox("Start Button clicked.")
    End If

よろしく

于 2012-09-11T02:31:09.903 に答える
-1

1 つのイベントでキーボードとマウスの両方でスタート ボタンを押す方法がよくわかりません。大まかな推測では、条件ステートメントがオフになっているようです。コードを読むべきではありません:

If GetKeyState(91) < 0 Or GetKeyState(1) < 0 Then
于 2012-09-11T02:10:53.620 に答える