VB6: shell funktioniert nur in der Programmoberfläöche

  • VB6

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von wernho.

    VB6: shell funktioniert nur in der Programmoberfläöche

    Folgendes Problem: Ich arbeite viel mit Autohotkey und spiele das MMO Elyon. Dieses Game verbietet aber Autohotkey, so muss ich es jedesmal vor dem Start von Elyon beenden.
    Nun habe ich mir ein Programm geschrieben, welches Autohotkey beendet und mit "shell" Elyon aufruft.
    Das Problem ist: wenn ich es über die Oberfläche von VB6 starte, funktioniert es. Wenn ich es aber über den kompilierten exe-File starte, kommt bei "shell" der Laufzeitfehler 5: ungültiger Prozeduraufruf ...
    Warum ist das bitte so?
    Hier der Programmcode (ist in Spoiler, da ein enig lang):
    Spoiler anzeigen

    Quellcode

    1. Option Explicit
    2. ' Prüft, ob eine EXE-Datei bereits ausgeführt wird und gibt im Erfolgsfall entweder das Fensterhandle oder die Process-ID zurück
    3. Public Function IsEXERunning(ByVal sFilename As String, Optional ByVal iReturn As procReturnValue = ProcessID) As Long
    4. Dim nResult As Long
    5. ' bei allen anderen Systemen...
    6. Dim lSnapshot As Long
    7. Dim uProcess As PROCESSENTRY32
    8. ' "Snapshot" des aktuellen Prozess ermitteln
    9. lSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
    10. If lSnapshot <> 0 Then
    11. uProcess.dwSize = Len(uProcess)
    12. ' Ersten Prozess ermitteln
    13. nResult = ProcessFirst(lSnapshot, uProcess)
    14. Do Until nResult = 0
    15. ' Prozessliste durchlaufen
    16. If InStr(LCase$(uProcess.szexeFile), LCase$(sFilename)) > 0 Then
    17. 'Jepp - EXE gefunden
    18. If iReturn = Handle Then
    19. IsEXERunning = ProcID2hWnd(uProcess.th32ProcessID)
    20. Else
    21. IsEXERunning = uProcess.th32ProcessID
    22. End If
    23. Exit Do
    24. End If
    25. ' nächster Prozess
    26. nResult = ProcessNext(lSnapshot, uProcess)
    27. Loop
    28. ' Handle schliessen
    29. CloseHandle lSnapshot
    30. End If
    31. End Function
    32. ' Ermittelt das Fensterhandle anhand einer Prozess-ID
    33. Private Function ProcID2hWnd(ByVal ProcID As Long) As Long
    34. ' alle Fenster durchlaufen und nach Process-ID suchen
    35. Dim lngHWnd As Long
    36. Dim lngProcTaskID As Long
    37. lngHWnd = FindWindow(vbNullString, vbNullString)
    38. Do While lngHWnd <> 0
    39. ' Existiert kein Eltern-Fenster, dann ProcssID
    40. ' ermitteln und mit TaskID vergleichen
    41. If GetParent(lngHWnd) = 0 Then
    42. GetWindowThreadProcessId lngHWnd, lngProcTaskID
    43. ' Handelt es sich um die gesuchte TaskID?
    44. If lngProcTaskID = ProcID Then
    45. ' Fenster-Handle zurückgeben und Schleife
    46. ' verlassen!
    47. ProcID2hWnd = lngHWnd
    48. Exit Do
    49. End If
    50. End If
    51. ' Nächstes Fenster
    52. lngHWnd = GetWindow(lngHWnd, GW_HWNDNEXT)
    53. Loop
    54. End Function
    55. ' Task beenden
    56. Public Sub TerminateTask(lTaskID As Long)
    57. Dim lhwnd As Long
    58. Dim lResult As Long
    59. lhwnd = OpenProcess(PROCESS_TERMINATE, 0&, lTaskID)
    60. lResult = TerminateProcess(lhwnd, 1&)
    61. 'lResult = CloseHandle(lhwnd)
    62. End Sub
    63. Private Sub Form_Activate()
    64. Dim iID As Long
    65. iID = IsEXERunning("AutoHotkey.exe")
    66. If (iID > 0) Then
    67. TerminateTask iID
    68. imgOk.Visible = True
    69. frmMain.Refresh
    70. Sleep 250
    71. Else
    72. imgCancel.Visible = True
    73. frmMain.Refresh
    74. Sleep 250
    75. End If
    76. iID = Shell("G:\Elyon\Elyon_Launcher.exe", vbNormalNoFocus)
    77. Sleep 1000
    78. Unload Me
    79. End Sub



    Kann mir da bitte jemand helfen?