SetForegroundWindow在游戏中具有不寻常的副作用

时间:2014-01-21 12:19:03

标签: vb.net click handle

我的工具(www.ljtd.net - 没有广告,就像有人想测试问题一样)我的英雄联盟有问题。让我们说除了一点点错误之外它都能正常工作。对于那些不了解比赛的人。这是一个像DotA一样的MOBA。

我现在的问题是我的工具是一个叠加层并显示游戏的其他信息。所以当点击这个工具时,点击不应该影响游戏行为(你应该留在游戏中,好像什么也没发生)。这就是我使用 SetForegroundWindow 的原因。游戏正在重新获得焦点,而且游戏中的小地图也在推动。但有时单击我的工具有另一种不寻常的行为。游戏仍然成为焦点。但是在小地图上行驶现在就好像你实际上按住那里的鼠标左键一样。

所以我的问题是为什么它有时与小地图一起正常工作,而50%的情况则没有。许多其他用户也有同样的问题。所以我认为这不是游戏或Windows配置。有没有办法更好地关注像英雄联盟这样的游戏?以下是 SetForegroundWindow 的一些代码:

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Public Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As IntPtr) As Int32
Public tHandle As Long = FindWindow(vbNullString, "League of Legends (TM) Client")

Public Sub SetForeground()
    SetForegroundWindow(tHandle)
End Sub

这个小片段实际上是游戏的焦点。如果您对该项目感兴趣或想进一步了解。看看这里:Complete Source code

感谢您提出的任何想法=)

我有另一个approch

只是为了表明我已经寻找其他方法了。这是一个带有相同结果的。总是小地图有点儿错误:

Public Structure PointAPI
    Public x As Integer
    Public y As Integer
End Structure
Module Module_SetMouseclick
    Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, ByVal dwExtraInfo As Integer)
    Public Declare Auto Function SetCursorPos Lib "User32.dll" (ByVal X As Integer, ByVal Y As Integer) As Long
    Declare Function GetCursorPos Lib "user32.dll" (ByRef lpPoint As PointAPI) As Boolean
    Private Const MOUSEEVENTF_LEFTDOWN = &H2
    Const MOUSEEVENTF_LEFTUP As Integer = &H4
    Public x, y As Integer
    Public Sub Position_Click(ByVal x As Integer, ByVal y As Integer, ByVal click As Boolean)
        SetCursorPos(x, y)
        If click Then
            mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 1)
        Else
            mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 1)
        End If
    End Sub
End Module

在其他地方我用

访问此功能
Module_SetMouseclick.Position_Click(500, 500, True)
Module_SetMouseclick.Position_Click(500, 500, False)

在500,500像素处左击鼠标的作用是什么。正如我所说的那样,只是给前景加上 SetForegroundWindow

1 个答案:

答案 0 :(得分:0)

解决方案是:

SetBackupCursorPos()
Position_Click(Module_Generate.ScreenWidth / 2, Module_Generate.ScreenHeight / 2, True)
Threading.Thread.Sleep(100)
Position_Click(x, y, False)

延迟现在可行。在100毫秒以下它仍然有100个一切似乎没问题。