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
Kann mir da bitte jemand helfen?
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):
Quellcode
- Option Explicit
- ' Prüft, ob eine EXE-Datei bereits ausgeführt wird und gibt im Erfolgsfall entweder das Fensterhandle oder die Process-ID zurück
- Public Function IsEXERunning(ByVal sFilename As String, Optional ByVal iReturn As procReturnValue = ProcessID) As Long
- Dim nResult As Long
- ' bei allen anderen Systemen...
- Dim lSnapshot As Long
- Dim uProcess As PROCESSENTRY32
- ' "Snapshot" des aktuellen Prozess ermitteln
- lSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
- If lSnapshot <> 0 Then
- uProcess.dwSize = Len(uProcess)
- ' Ersten Prozess ermitteln
- nResult = ProcessFirst(lSnapshot, uProcess)
- Do Until nResult = 0
- ' Prozessliste durchlaufen
- If InStr(LCase$(uProcess.szexeFile), LCase$(sFilename)) > 0 Then
- 'Jepp - EXE gefunden
- If iReturn = Handle Then
- IsEXERunning = ProcID2hWnd(uProcess.th32ProcessID)
- Else
- IsEXERunning = uProcess.th32ProcessID
- End If
- Exit Do
- End If
- ' nächster Prozess
- nResult = ProcessNext(lSnapshot, uProcess)
- Loop
- ' Handle schliessen
- CloseHandle lSnapshot
- End If
- End Function
- ' Ermittelt das Fensterhandle anhand einer Prozess-ID
- Private Function ProcID2hWnd(ByVal ProcID As Long) As Long
- ' alle Fenster durchlaufen und nach Process-ID suchen
- Dim lngHWnd As Long
- Dim lngProcTaskID As Long
- lngHWnd = FindWindow(vbNullString, vbNullString)
- Do While lngHWnd <> 0
- ' Existiert kein Eltern-Fenster, dann ProcssID
- ' ermitteln und mit TaskID vergleichen
- If GetParent(lngHWnd) = 0 Then
- GetWindowThreadProcessId lngHWnd, lngProcTaskID
- ' Handelt es sich um die gesuchte TaskID?
- If lngProcTaskID = ProcID Then
- ' Fenster-Handle zurückgeben und Schleife
- ' verlassen!
- ProcID2hWnd = lngHWnd
- Exit Do
- End If
- End If
- ' Nächstes Fenster
- lngHWnd = GetWindow(lngHWnd, GW_HWNDNEXT)
- Loop
- End Function
- ' Task beenden
- Public Sub TerminateTask(lTaskID As Long)
- Dim lhwnd As Long
- Dim lResult As Long
- lhwnd = OpenProcess(PROCESS_TERMINATE, 0&, lTaskID)
- lResult = TerminateProcess(lhwnd, 1&)
- 'lResult = CloseHandle(lhwnd)
- End Sub
- Private Sub Form_Activate()
- Dim iID As Long
- iID = IsEXERunning("AutoHotkey.exe")
- If (iID > 0) Then
- TerminateTask iID
- imgOk.Visible = True
- frmMain.Refresh
- Sleep 250
- Else
- imgCancel.Visible = True
- frmMain.Refresh
- Sleep 250
- End If
- iID = Shell("G:\Elyon\Elyon_Launcher.exe", vbNormalNoFocus)
- Sleep 1000
- Unload Me
- End Sub
Kann mir da bitte jemand helfen?