GetActiveWindow () не всегда возвращает активное окно? - PullRequest
0 голосов
/ 20 апреля 2011

Я создаю игру, в которой используются Control.MouseButtons и GetActiveWindow(), например:

        Private Declare Auto Function GetActiveWindow Lib "user32.dll" () As IntPtr

        Public Sub GetMouseState(ByRef x As Integer, ByRef y As Integer, ByRef lButton As Boolean)
            Dim p As Point = Parent.PointToClient(Windows.Forms.Cursor.Position)
            x = p.X
            y = p.Y
            lButton = _
                (Control.MouseButtons And MouseButtons.Left) = MouseButtons.Left AndAlso _
                 Parent.Handle = GetActiveWindow()
        End Sub

(Parent - это Form.)

.случается самое странное;в первой «сцене» моей игры (меню) это работает правильно.Во втором (реальный игровой процесс) это не похоже на работу.Происходит самое странное: я могу проверить, что этот метод работает в методе рендеринга:

    Dim down As Boolean
    Game.GetMouseState(0, 0, down)
    If down Then g.Clear(Color.Red)

И, конечно же, когда я щелкаю мышью, экран становится красным.Однако мой объект не двигается.Когда я снимаю проверку Parent.Handle = GetActiveWindow(), мой объект движется !!Вот код для этого, хотя это, вероятно, не имеет значения:

    Dim mouseX, mouseY As Integer, mouseDown As Boolean
    Game.GetMouseState(mouseX, mouseY, mouseDown)

    If mouseDown Then
        Dim mouseLocation As New PointF(mouseX - Game.Width \ 2, mouseY - Game.Height \ 2)

        centerParticle.MoveTowards(mouseLocation, centerParticle.Location)
    End If

Разве GetActiveWindow () не возвращает правильное значение, только когда моя игра запущена?: P

1 Ответ

1 голос
/ 20 апреля 2011

Недостаточно кода, чтобы попытаться повторить эту проблему.Только не делай так.Реализуйте обработчик для события Deactivate формы, ваш игровой цикл должен прекратить обновлять все.Включая опрос мыши.Используйте событие Activate, чтобы включить его снова.

...