Tastendruck im Spiel soll Ereignis auslösen

  • VB6

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Alex2000.

    Tastendruck im Spiel soll Ereignis auslösen

    Hallo bin Einsteiger,
    lege aber gleich los wenn es auch unhöflich ist.
    Ich hab nen kleines Tool geplant, aber mir fehlen halt die restlichen kenntnisse.
    Vielleicht könnt ihr mir ja helfen ;)

    Also das tool sollte können:

    -Programmaufruf durch Tastendruck im Spiel (zB. Num 9)
    -Nach dem Port (:4000) und den Servern (.83) kann gesucht werden

    -cmd.exe soll unsichtbar aufgerufen werden
    -soll auf allen Rechnern gestartet werden (Shareware)
    -netstat -n Befehl mit Enter abschliessen
    -Server mit der richtigen Portnummer (:4000) raussuchen
    -cmd.exe schliessen (resourcen sparen)

    -Mit der Suchliste vergleichen (Serverabgleich)
    -Ausgabe des Servers im Spiel (enter >> chatfenster >> "Server .83" >> enter)

    Ich würde gerne wissen wie ich durch nen tastendruck in egal welchem spiel, fenster, oder ordner mit der taste das ereignis auslösen kann.
    Macro nennt man das glaube.

    naja lasse das mal so stehen, schlecht geschrieben im moment nicht mehr zeit dafür, editeire es vielelicht später falls es überhaupt keiner versteht xD

    danke schonmal in voraus an die netten Helfer.
    Die hab ich nicht, leider.

    Suchmaske:
    Dazu startet man die DiaClone.exe trägt die Server ein die man suchen will.
    Num 9 soll eine Zusatzfunktion bekommen. (Hier komm ich bis jetzt nicht weiter).
    Man könnte auch oft gesagte sätze eintragen, so als Beispiel aber wir planen das mit dem Netstat Befehl.



    Netstat soll man nicht sehen.



    Spiel, Diablo 2 Klassiker



    Tja leute ich geb nicht nach, helft mir ;)
    Wie man den Konsoleninhalt in einen String lädt und wie man die Tastatur simuliert wurde schon öfter hier behandelt. Da es sich hier aber wahrscheinlich um ein DirectX-Spiel handelt, wird das simulieren evtl nicht funktionieren da die Hardware direkt abgefragt werden könnte.
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    Nö es geht, das Spiel nennt man auch "The Mother of all Hacks".

    Meines ist kein Hack, es spart mir halt paar Tastendrücke, Klicks,
    den mit diesem Tool bräuchte ich nicht mehr aus dem Game zu switchen und manuell nachschauen.

    Quellcode

    1. Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    2. Private Sub Timer1_Timer()
    3. If CompKey(vbKeyNumlock) Then
    4. DoEvents
    5. SendKeys "{Enter}"
    6. SendKeys "vb-paradise.de", True
    7. SendKeys "vb-paradise.de", True
    8. SendKeys "{Enter}"
    9. End If
    10. End Sub
    11. Private Function CompKey(KCode As Long) As Boolean
    12. Dim Result As Integer
    13. Result = GetAsyncKeyState(KCode)
    14. CompKey = (Result = -32767)
    15. End Function


    vb-paradise.de muss ich 2 mal eintragen weil im internet eine verzögerung gibt aber vielelicht kann man das irgendwie mit einem break lösen, aber da müst ihr auch helfen, bin nähmlich noob :)

    hab des jetzt mit numlock gelöst kennt jemand die tasten combination für num9 ?

    Also Leute hab die konsoleninhalt in einen String laden können.

    Quellcode

    1. Set objShell = CreateObject("WScript.Shell")
    2. Set objExec = objShell.Exec("netstat -n")
    3. strPingResults = LCase(objExec.StdOut.ReadAll)
    4. Platzhalter = (strPingResults)
    5. Text2.Text = Platzhalter




    Brauche vorschläge wie man am besten diese :4000 sucht
    und die zahl davor in einer variablen abspeichert.
    in der Konsole können mehrere IP's mit dieser :4000 vorkommen, deshalb wäre es
    von vorteil die mit zu führen.

    Bitte nicht schliessen wir fassen alles am schluss zusammen ;)
    wird nen schöner guide :)

    Quellcode

    1. Private Sub Command1_Click()
    2. Dim RemoteText As String
    3. Dim Zahl As Integer
    4. Dim Server As String
    5. 'Shell "CMD /k netstat -n"
    6. Set objShell = CreateObject("WScript.Shell")
    7. Set objExec = objShell.Exec("netstat -n")
    8. strPingResults = LCase(objExec.StdOut.ReadAll)
    9. RemoteText = (strPingResults)
    10. Zahl = InStr(1, RemoteText, ":4000", vbTextCompare)
    11. For i = (Zahl - 3) To (Zahl - 1) Step 1
    12. Server = Server + Mid(RemoteText, i, 1)
    13. Next
    14. Text2.Text = Server
    15. End Sub


    Also so funktionierst aufjedenfall mit einem server, umständlich aber es geht :)

    Was ist wenn 2 ":4000" im string sind wie sagt man dem das der weiter suchen soll ?

    [Edit] ok ich wüste wie aber ist sehr blöde programmierung, kentn da jemand nicht was besseres ?

    Quellcode

    1. Zahl = InStr(1, RemoteText, ":4000", vbTextCompare)
    2. If Zahl <> 0 Then
    3. zahl2 = InStr((Zahl + 1), RemoteText, ":4000", vbTextCompare)
    4. End If
    5. If zahl2 <> 0 Then
    6. zahl3 = InStr((zahl2 + 1), RemoteText, ":4000", vbTextCompare)
    7. End If
    8. If Zahl <> 0 Then
    9. For i = (Zahl - 3) To (Zahl - 1) Step 1
    10. Server = Server + Mid(RemoteText, i, 1)
    11. Next
    12. End If
    13. If zahl2 <> 0 Then
    14. For i = (zahl2 - 3) To (zahl2 - 1) Step 1
    15. Server2 = Server2 + Mid(RemoteText, i, 1)
    16. Next
    17. End If
    18. If zahl3 <> 0 Then
    19. For i = (zahl3 - 3) To (zahl3 - 1) Step 1
    20. Server3 = Server3 + Mid(RemoteText, i, 1)
    21. Next
    22. End If
    23. Text2.Text = Server
    24. Text3.Text = Server2
    25. Text4.Text = Server3


    so funktioniert es, mußte 6 Variablen deklarieren, des geht bestimmt schöner.

    Mit der Schleife weis ich nicht wie du das meinst, wie gesagt Anfänger,
    lerne aber eigentlich schnell...

    arrays wären bestimmt sinnvoll aber bis jetzt kriege ich das nicht hin...
    Ich versuche es nochmal zu erklären.

    Was ich schon mit deiner hilfe realisiert habe,

    wenn ich auf einen cmd_Button klicke liest er die Server mit der portnummer :4000 aus dem konsoleninhalt raus,
    speichert diese in einer variablen (auch textbox).

    wenn ich num9 druecke schreibt der im spiele chat irgendeinen satz den ich reinschreibe.

    so nun versuche ich beides zu koppeln am besten ohne cmd_button,

    also das im spiel einfach im chat fenster erscheint server xxx

    Hier nochmal der komplette code:

    Brainfuck-Quellcode

    1. Dim RemoteText As String
    2. Dim Zahl As Integer
    3. Dim zahl2 As Integer
    4. Dim zahl3 As Integer
    5. Dim Server As String
    6. Dim Server2 As String
    7. Dim Server3 As String
    8. Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    9. Private Sub Command1_Click()
    10. Set objShell = CreateObject("WScript.Shell")
    11. Set objExec = objShell.Exec("netstat -n")
    12. strPingResults = LCase(objExec.StdOut.ReadAll)
    13. RemoteText = (strPingResults)
    14. '------------------------------------------------
    15. Zahl = InStr(1, RemoteText, ":4000", vbTextCompare)
    16. If Zahl <> 0 Then
    17. zahl2 = InStr((Zahl + 1), RemoteText, ":4000", vbTextCompare)
    18. End If
    19. If zahl2 <> 0 Then
    20. zahl3 = InStr((zahl2 + 1), RemoteText, ":4000", vbTextCompare)
    21. End If
    22. '-------------------------------------------------
    23. If Zahl <> 0 Then
    24. For i = (Zahl - 3) To (Zahl - 1) Step 1
    25. Server = Server + Mid(RemoteText, i, 1)
    26. Next
    27. End If
    28. If zahl2 <> 0 Then
    29. For i = (zahl2 - 3) To (zahl2 - 1) Step 1
    30. Server2 = Server2 + Mid(RemoteText, i, 1)
    31. Next
    32. End If
    33. If zahl3 <> 0 Then
    34. For i = (zahl3 - 3) To (zahl3 - 1) Step 1
    35. Server3 = Server3 + Mid(RemoteText, i, 1)
    36. Next
    37. End If
    38. Text2.Text = Server
    39. Text3.Text = Server2
    40. Text4.Text = Server3
    41. End Sub
    42. Private Sub Timer1_Timer()
    43. If CompKey(vbKeyNumpad9) Then
    44. DoEvents
    45. SendKeys "{Enter}"
    46. SendKeys "Hallo dies ist ein text den ich in ein macro gepackt ahbe xD", True
    47. SendKeys "Hallo dies ist ein text den ich in ein macro gepackt ahbe xD", True
    48. SendKeys "{Enter}"
    49. End If
    50. End Sub
    51. Private Function CompKey(KCode As Long) As Boolean
    52. Dim Result As Integer
    53. Result = GetAsyncKeyState(KCode)
    54. CompKey = (Result = -32767)
    55. End Function


    ich suche den :4000 port weil der zum spiel gehört,
    es finden evetns statt und die sind nur auf einigen servern die man halt sucht...
    Ok gut, mit Server oder Spiele hab bis jetz nicht ausseinander gestzt, kann hier weniger helfen, aber ich versuche wenigstens was lösen damit du weiter kommst.
    Also du sagst du hast mir Arrays noch nie gearbeitet, ok ich schreib ein kleines Beispiel dann muß das in deine Code rein integrieren.

    Visual Basic-Quellcode

    1. Private zPort as Long
    2. Private PortVerleichen As Boolean
    3. Private Port() As String 'Array
    4. Ptivate i As Long
    5. Private PortNumber As Long
    6. 'anzahl der Zeilen in Console ermitteln
    7. 'z.B Anzahl der Zeilen 5 dann laufe in die Schleife und füge
    8. 'alle Ports mit 4000
    9. i = 0
    10. For zPort = 1 to 5
    11. 'hier die Code "Suchen das Zahl 4000"
    12. PortVergleichen = 4000 like PortNumber 'Gefudende Ports mit "4000" vergleichen
    13. If PortVergleichen = True Then
    14. Redim Preserve Port(i) 'ein Datenfeld in Array resarvieren
    15. Port(i) = PortNumber 'Wert in Array schreiben
    16. i = i + 1 'weiter Datenfeld in Array resarvieren
    17. Next
    18. Port(i) = '
    19. 'Und hier die Code für Anzeige inhalt der Array



    Mfg Alex
    Jo Beispiel verstehe ich aber beim umsetzen wirds bei mir länger dauern,
    bei mir bin ich fast schon durch, im spiel kann ich mir alle server anzeigen lassen.
    Geht also schon, hat aber noch paar bugs.

    z.B der erste probier mal den code hier aus:

    Quellcode

    1. Private Sub Command1_Click()
    2. strTarget = "127.0.0.1"
    3. Set objShell = CreateObject("WScript.Shell")
    4. Set objExec = objShell.Exec("ping -n 2 -w 1000 " & strTarget)
    5. strPingResults = LCase(objExec.StdOut.ReadAll)
    6. MsgBox (strPingResults)
    7. End Sub


    da erscheint kurz das dos fenster, kann man das abstellen?
    das es garnicht aktiv wird also im hintergrund aufspringt?

    Alex2000 schrieb:

    Du rufst in deine Code das DOS auf

    Visual Basic-Quellcode

    1. Set objExec = objShell.Exec("netstat -n")


    lösche das raus und probier ob dann Funktioniert !

    Mfg Alex
    Nee ohne diese Zeile funktioniert es nicht !


    Dosbox auslesen
    Dieses Script gibt das Ergebnis einer Dosbox in einer Messagebox wieder.
    Bei diesem Beispiel wird ein Ping ausgeführt und das Ergebnis ausgegeben.

    strTarget = "127.0.0.1"
    Set objShell = CreateObject("WScript.Shell")
    Set objExec = objShell.Exec("ping -n 2 -w 1000 " & strTarget)
    strPingResults = LCase(objExec.StdOut.ReadAll)
    msgbox(strPingResults)

    Jetzt aber meine Frage: wie verhindere ich, dass das Konsolenfenster jedesmal erscheint?

    wenn du das handle der dosbox hast....

    SetParent AppHandle, Form1.Picture1.hwnd

    damit wird die dosbox in deine anwendung geladen(in eine PICBox) und du kannst sie "verschwinden lassen"
    das letzte zitat vestehe ich nicht, ich will es verschwinden lassen maaaaaaaaaaan!!!!!!!!!!!!
    Raste gleich aus ;)
    Hmmm hier habe ich noch eine Beipiel Code wie du Fremd Fenster unterdrücken kannst, merh weise ich nicht :

    Visual Basic-Quellcode

    1. 'Control ListBox: List1
    2. 'Control TextBox: Text1
    3. 'Control CommandButton: Command2
    4. 'Control CommandButton: Command1
    5. 'Control Label: Label1
    6. Option Explicit
    7. Private Declare Function GetWindow Lib "user32" (ByVal hwnd _
    8. As Long, ByVal wCmd As Long) As Long
    9. Private Declare Function GetWindowTextLength Lib "user32" _
    10. Alias "GetWindowTextLengthA" (ByVal hwnd As Long) _
    11. As Long
    12. Private Declare Function GetWindowText Lib "user32" Alias _
    13. "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString _
    14. As String, ByVal cch As Long) As Long
    15. Private Declare Function SendMessage Lib "user32.dll" Alias _
    16. "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
    17. ByVal wParam As Long, lParam As Any) As Long
    18. Const GW_HWNDFIRST = 0
    19. Const GW_HWNDNEXT = 2
    20. Const WM_CLOSE = &H10
    21. Private Sub Command1_Click()
    22. Call EnumWindows
    23. End Sub
    24. Private Sub EnumWindows()
    25. Dim hwnd&, Result&, Title$
    26. List1.Clear
    27. hwnd = GetWindow(Me.hwnd, GW_HWNDFIRST)
    28. Do
    29. Result = GetWindowTextLength(hwnd) + 1
    30. Title = Space$(Result)
    31. Result = GetWindowText(hwnd, Title, Result)
    32. Title = Left$(Title, Len(Title) - 1)
    33. If InStr(1, Title, Text1.Text) Then
    34. List1.AddItem Title
    35. List1.ItemData(List1.NewIndex) = hwnd
    36. End If
    37. hwnd = GetWindow(hwnd, GW_HWNDNEXT)
    38. Loop Until hwnd = 0
    39. If List1.ListCount > 0 Then
    40. Command2.Enabled = True
    41. Else
    42. Command2.Enabled = False
    43. End If
    44. End Sub
    45. Private Sub Command2_Click()
    46. Dim x&, y&, hwnd&
    47. x = List1.ListCount
    48. If x > 0 Then
    49. For y = 0 To x - 1
    50. hwnd = List1.ItemData(y)
    51. If hwnd = Me.hwnd Then MsgBox ("Nagut, wie gewünscht!")
    52. SendMessage hwnd, WM_CLOSE, ByVal 0&, ByVal 0&
    53. Next y
    54. End If
    55. Command2.Enabled = False
    56. End Sub
    57. Private Sub Form_Load()
    58. Command2.Enabled = False
    59. End Sub


    oder schau mal hier rein, oder hier !

    Mfg Alex