Fokussieren eines Spieles (LoL) stark störanfällig

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von kwoxer.

    Fokussieren eines Spieles (LoL) stark störanfällig

    Ich habe ein sehr spezielles Problem mit einem meiner Programme in Zusammenhang mit dem Spiel League of Legends (LoL). Für alle, die das Spiel nicht kennen, es ist das derzeit populärste Spiel und stammt von Riot Games.

    Das gemeinte Programm (ljtd.eu) ist eine Art Overlay, also quasi wird LoL im Fenstermodus gespielt und das Programm befindet sich on Top und bietet viele hilfreiche Zusatzinformationen. Alles funktioniert soweit sehr gut.

    Nun ist das Problem, dass ich ein Feature eingebaut habe, welche dem Spiel automatisch den Fokus gibt wenn ein Element des Tools angeklickt wird. Dieses SetForegroundWindow funktioniert auch wunderbar. Allerdings hat es den Schönheitsfehler, dass wenn man nun über die Minimap in LoL fährt in ~50% aller Fälle der Mauszeiger "entführt" wird. Darunter ist zu verstehen, dass die Minimap ohne Linksklick nun an der Stelle fokussiert wird, wo sich der Mauszeiger über der Minimap befindet. Dies ist jedoch nicht gewollt und stellt eine starke Beeinträchtigung dar.

    SetForegroundWindow

    Quellcode

    1. Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
    2. Public Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As IntPtr) As Int32
    3. Public tHandle As Long = FindWindow(vbNullString, "League of Legends (TM) Client")
    4. Public Sub SetForeground()
    5. SetForegroundWindow(tHandle)
    6. End Sub


    Also daher meine Frage, wieso klappt es in 50% der Fälle und in den anderen jedoch nur mit dem "Schönheitsfehler"? Viele meiner Nutzer haben das gleiche Problem und keine spezielle Hardware oder OS am laufen.

    Ich hatte auch schon eine andere Idee und zwar einfach einen ganz normalen Klick zu simulieren. Aber dies führte zu dem gleichen "Bug". in beiden Fällen klappt es zu etwa 50%.

    Andere Idee

    Quellcode

    1. Public Structure PointAPI
    2. Public x As Integer
    3. Public y As Integer
    4. End Structure
    5. Module Module_SetMouseclick
    6. 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)
    7. Public Declare Auto Function SetCursorPos Lib "User32.dll" (ByVal X As Integer, ByVal Y As Integer) As Long
    8. Declare Function GetCursorPos Lib "user32.dll" (ByRef lpPoint As PointAPI) As Boolean
    9. Private Const MOUSEEVENTF_LEFTDOWN = &H2
    10. Const MOUSEEVENTF_LEFTUP As Integer = &H4
    11. Public x, y As Integer
    12. Public Sub Position_Click(ByVal x As Integer, ByVal y As Integer, ByVal click As Boolean)
    13. SetCursorPos(x, y)
    14. If click Then
    15. mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 1)
    16. Else
    17. mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 1)
    18. End If
    19. End Sub
    20. End Module


    Wäre echt schön wenn jemand eine Idee hätte, bin schon seit einiger Zeit am nachforschen und vermutlich ist die Lösung sehr trivial. Danke für eure Zeit =)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „kwoxer“ ()

    Coldfire schrieb:

    versuchs doch mal mit AppActivate


    Funktioniert nich einwandfrei bzw. sogar noch schlechter. Trotzdem vielen Dank.

    Edit: muss mich korrigieren, ist kein Unterschied zu meiner Methode zu merken. Immer noch die gleichen Probleme in 50% der Fälle. =/

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „kwoxer“ ()

    Hatte noch nich allzuviel Zeit zum Testen. Aber ich glaube ich hab es.

    Ich hab zwischen den ForeGround bzw AppActivate Events jetzt einfach testweise ein Sleep Event gelegt. Und bei ca 30 Versuchen hat es geklappt. Allerdings mit 100ms delay. Ich werde mal schauen wie weit ich das runterbekomme.

    Und was sollte mir Spy++ bringen? Ich meine das Fenster hab ich ja, ist ja halt nur der Minimap bug. Naja ich teste mal weiter wenn ich wieder Zeit hab. Schon komisch, dass es an solchen simplen Geschichte wie fehlenden Delays liegt. Aber naja.

    Danke trotzdem =)
    Habs mittlerweile hinbekommen. 100ms delay müssen es anscheinend sein. Bei etwas weniger tritt der Fehler vermehrter wieder auf. Schon seltsam aber bei 100ms klappt es wie erwartet. Danke nochmal.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „kwoxer“ ()