Auslesen der PID (Prozessname bekannt), VB6

hallo
ich stehe mal wieder vor nem prob
Benutzt VB6

Ich habe folgendes Problem, bei dem mir googlen bisher auch nicht weitergeholfen hat:

Mein Programm soll anhand des Prozessnamens, der mir bekannt ist, die Prozess-ID herausfinden und ihn killen

Wenn es einfacher gehen sollte, also einen Prozess über seinen Namen zu killen, bevorzuge ich dieses latürnich.

Bin für hilfreiche Links ebenso dankbar wie für Codeschnipsel.

mfg
uma

Hallo,

sieh Dir das mal an:
http://www.activevb.de/tipps/vb6tipps/tipp0273.html

Gruß, Rainer

hallo

Hallo,

Alternativ kannst du auch hier einmal schauen.
Ein wenig umschreiben und schon das Teil genau den Dienst, den du wünschst :smile:

http://support.microsoft.com/kb/508255/de

MFG Alex

danke
Morgen
also vielen dank werde mich gleich an die arbeit machen
und es testen

habs gerade versucht hab einfach mal des beispielprogramm heruntergeladen aber des funkt net mal da wir des notpad geöffnet aber es wird nicht geschlossen…

vieleicht kannst mir ja noch weiterheflen währe echt gut

mfg
uma

Hallo,

habs gerade versucht hab einfach mal des beispielprogramm
heruntergeladen aber des funkt net mal da wir des notpad
geöffnet aber es wird nicht geschlossen…

vieleicht kannst mir ja noch weiterheflen währe echt gut

verrate doch mal, welches Betriebssystem Du verwendest. Einen Task abschießen ist mit VB6 und Win98 leicht, bei XP funktioniert das selbe Programm dann nicht mehr.

Gruß, Rainer

ok ^^ ich benutzte win xp

und des prog soll dann auch auf win xp rechnern laufen…

mfg
uma

Hi uma,

OK. Ein wenig Geduld bitte … :smile:

Gruß, Rainer

Hi uma,

ich habe etwas an dem Code von AVB herumgeschraubt, bevor ich dumme Fragen gestellt habe.

Nimm mal eine leere Form und lege ein paar Steuerelemente d’rauf.:

1 Liste (List1)
2 Text (Text1 und Txt2)
2 Button (Command1 und Command2)

Command1 beschriftest Du mit ‚Taskliste laden‘
Command2 beschriftest Du mit ‚Task killen‘

Bedienung: Starten, Command1 klicken, Programm in der Liste suchen und anklicken. Der Name steht dann in Text1, das Handle in Text2.
Dann noch Command2 klicken, das Programm wird beendet.

Code:

Option Explicit

Private Declare Function GetWindow Lib "user32" (ByVal hwnd \_
 As Long, ByVal wCmd As Long) As Long

Private Declare Function GetWindowTextLength Lib "user32" \_
 Alias "GetWindowTextLengthA" (ByVal hwnd As Long) \_
 As Long

Private Declare Function GetWindowText Lib "user32" Alias \_
 "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString \_
 As String, ByVal cch As Long) As Long

Private Declare Function SendMessage Lib "user32.dll" Alias \_
 "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, \_
 ByVal wParam As Long, lParam As Any) As Long

Const GW\_HWNDFIRST = 0
Const GW\_HWNDNEXT = 2
Const WM\_CLOSE = &H10

Private Sub Command1\_Click()
 Call EnumWindows
End Sub

Private Sub EnumWindows()
 Dim hwnd&, Result&, Title$

 List1.Clear
 hwnd = GetWindow(Me.hwnd, GW\_HWNDFIRST)

 Do
 Result = GetWindowTextLength(hwnd) + 1
 Title = Space$(Result)
 Result = GetWindowText(hwnd, Title, Result)
 Title = Left$(Title, Len(Title) - 1)

 If Trim(Title) "" Then
 List1.AddItem Title
 List1.ItemData(List1.NewIndex) = hwnd
 End If

 hwnd = GetWindow(hwnd, GW\_HWNDNEXT)
 Loop Until hwnd = 0

 If List1.ListCount \> 0 Then
 Command2.Enabled = True
 Else
 Command2.Enabled = False
 End If
End Sub

Private Sub Command2\_Click()
 Dim hwnd&
 hwnd = Val(Text2.Text)
 SendMessage hwnd, WM\_CLOSE, ByVal 0&, ByVal 0&
 Command2.Enabled = False
End Sub

Private Sub Form\_Load()
 Command2.Enabled = False
End Sub

Private Sub List1\_Click()
 Text1.Text = List1.List(List1.ListIndex)
 Text2.Text = List1.ItemData(List1.ListIndex)
End Sub

Gruß, Rainer

also vielen dank für den aufwand

so jetzt muss ich nur noch den code umschreiben dass es das programm automatisch sucht und schließt aber ich glaube das werde ich schaffen

mfg
uma

Hallo,

also vielen dank für den aufwand

nichts zu danken, das wollte ich auch schon immer mal, hab’s nur noch nie geschafft.

so jetzt muss ich nur noch den code umschreiben dass es das
programm automatisch sucht und schließt aber ich glaube das
werde ich schaffen

Du willst mit den Exe-Namen suchen? Poste hier mal den Code, wenn Du das fertig hast, das habe ich nämlich noch nicht. :smile:

Gruß, Rainer

Hallo
is doch gar net so leicht wie ich gedacht habe XD
habs zwar jetzt n bissel runtergekürzt so wie ichs ca brauche. Hab schon ne „such“ funktion eingebaut aber jetzt is des problem geht das so überhaupt wie ich mit dass vorgestellt habe.
ich habe einfach mal zum Testen genommen das er den calc suchen soll…
hier erst mal der code wie ich ihn mir vorstelle

Private Sub EnumWindows()

Dim hwnd&, Result&, Title$
List1.Clear
hwnd = GetWindow(Me.hwnd, GW_HWNDFIRST)
Do
Result = GetWindowTextLength(hwnd) + 1
Title = Space$(Result)
Result = GetWindowText(hwnd, Title, Result)
Title = Left$(Title, Len(Title) - 1)
If Trim(Title) „“ Then
List1.AddItem Title
List1.ItemData(List1.NewIndex) = hwnd
End If
hwnd = GetWindow(hwnd, GW_HWNDNEXT)
Loop Until hwnd = 0
If List1.ListCount > 0 Then
Command2.Enabled = True
End If
Dim sSuchText As String
Dim i As Integer

'Suchtext ermitteln:
sSuchText = „Rechner“

'Schleife über alle Einträge in Liste (List1)…
For i = 0 To List1.ListCount - 1
If UCase(sSuchText) = _
UCase(Left(List1.List(i), Len(sSuchText))) Then

'So und hier müste dann noch hin dass er das suchergebins
'markiert aber ich habe schon n paar sachen getestet
'mit Listbox.Selected usw

ListIndex
End If
Next i
End Sub
Private Sub Command2_Click()

Dim hwnd&
hwnd = Val(List1.ItemData(List1.ListIndex))
SendMessage hwnd, WM_CLOSE, ByVal 0&, ByVal 0&
Command2.Enabled = True
End Sub

Hallo,

is doch gar net so leicht wie ich gedacht habe XD

ja, ich weiß. :smile: Eine noch verschwommene Idee, wie es gehen könnte habe ich im Kopf, die hat aber noch nicht die Gestalt eines Quellcodes. :smile:

habs zwar jetzt n bissel runtergekürzt so wie ichs ca brauche.
Hab schon ne „such“ funktion eingebaut aber jetzt is des
problem geht das so überhaupt wie ich mit dass vorgestellt
habe.

Den komplizierten Code muss ich mir erst mal genauer ansehen, aber ich frage einfach mal etwas, mal sehen, ob wir den überhaupt brauchen.

Du arbeitest die ganze Zeit mit Handles und deshalb mit Fenstertiteln statt mit .exe Namen. Das funktioniert natürlich nur so lange, wie Du das auf Programme anwendest, bei denen zur Laufzeit der Titel nicht verändert wird. Wenn das OK ist, könnte es recht leicht werden.

Was tut Dein Code eigentlich? Gibt der einfach nur das Handle eines Fensters zurück, dessen Titel Du kennst? Dann geht das mit FindWindow einfacher.

Starte mal das Notepad und lass es leer, nicht sichern, Namen festlegen …
Dann kopierst Du den folgenden Code in ein leeres Projekt, keine Steuerelemente und startest das ‚Programm‘. :smile: In der Titelzeile steht dann das Handle des Notepads.

Option Explicit

Private Declare Function FindWindow Lib "user32" \_
Alias "FindWindowA" (ByVal lpClassName As String, \_
ByVal lpWindowName As String) As Long

Private Sub Form\_Load()
 Me.Caption = FindWindow(vbNullString, "Unbenannt - Editor")
End Sub

um einfach nur das Programm ‚Rechner‘ anzuhalten, genügt das hier:

Option Explicit

Private Declare Function FindWindow Lib "user32" \_
Alias "FindWindowA" (ByVal lpClassName As String, \_
ByVal lpWindowName As String) As Long

Private Declare Function SendMessage Lib "user32" \_
Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, \_
ByVal wParam As Integer, ByVal lParam As Any) As Long

Const WM\_Close = &H10


Private Sub Form\_Load()
 Dim Handle As Long
 Handle = FindWindow(vbNullString, "Rechner")
 If Handle 0 Then
 SendMessage Handle, WM\_Close, ByVal 0&, ByVal 0&
 End If
 End
End Sub

Hilft das?

Gruß, Rainer

Hallo
Also *ganz tief lufthol* ich muss überne Barcodescanner eingabe
ein paar sachen automatisch erledigen lassen

  1. er soll Prüfen ob es ner seriennummer entspricht (also mit YK anfangen)(erledigt)
  2. er soll die eingabe in ne txt schreiben (erledigt)
  3. er soll 2 programme öffnen (zum ausdrucken eines labels)(erledigt)
  4. er soll 10 sec pause machen (damit des prog drucken kann)(erledigt)
  5. er soll beide programme wieder schließen ohne speichern usw
    so des wars eigentlich schon^^
    unten poste ich noch den code…

also deine variante funktioniert schon blos bei der lableshop datei frägt er ob man speicherwill er soll es aber nicht fragen sonder nur schließen ohne zu speichern

Noch ne frage geht es das ich das programm durch ein enter drücken starte? also bis jetzt muss ich ja in des text feld klicken damit es startet (Private Sub SN_click())
das währe dann echt cool da der barcodescanner zuerst die zahlen hinschreibt und dann ein enter drückt…
hier is dann noch der code

mfg
uma

Private Declare Sub Sleep Lib „kernel32“ _
(ByVal dwMilliseconds As Long)
Private Declare Function FindWindow Lib „user32“ _
Alias „FindWindowA“ (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib „user32“ _
Alias „SendMessageA“ (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Integer, ByVal lParam As Any) As Long

Const WM_Close = &H10

Private Sub SN_click()
Dim cSnString As String
If Left$(SN.Text, 2) = „YK“ Then
cSnString = Mid$(SN.Text, 3)
F = FreeFile
Open „d:\Profiles\ABGTEAMCUZ1\Desktop\Druckerlabel\Neu Textdokument.txt“ For Output As #F
Print #F, SN.Text
Close #F
Dim objShell
Set objShell = CreateObject(„WScript.Shell“)
objShell.Run „D:\ScanPrgramm\Document2.Lab“
Sleep 5000

Shell „C:\Program Files\Intermec\LabelShop Ultra 6\Tools\DManME\DManMe.exe“, MinimizedNoFocus
Sleep 10000

Dim Handle As Long
Handle = FindWindow(vbNullString, „Database Manager Me - [D:\ScanPrgramm\Fix Daten.MDB]“)
SendMessage Handle, WM_Close, ByVal 0&, ByVal 0&
'im Handle As Long
Handle = FindWindow(vbNullString, „LabelShop ULTRA 6 - Document2.Lab“)
SendMessage Handle, WM_Close, ByVal 0&, ByVal 0&

SN.Text = „“
Else
MsgBox „Dies ist keine Seriennummer!“, vbCritical, „Scannen von Seriennummern“

SN.Text = „“
End If
End Sub

Hallo,

Also *ganz tief lufthol* ich muss überne Barcodescanner
eingabe
ein paar sachen automatisch erledigen lassen

  1. er soll Prüfen ob es ner seriennummer entspricht (also mit
    YK anfangen)(erledigt)
  2. er soll die eingabe in ne txt schreiben (erledigt)
  3. er soll 2 programme öffnen (zum ausdrucken eines
    labels)(erledigt)
  4. er soll 10 sec pause machen (damit des prog drucken
    kann)(erledigt)
  5. er soll beide programme wieder schließen ohne speichern usw
    so des wars eigentlich schon^^

ach so, na sag das doch gleich, dann ist es ja noch einfacher! *fg*

Bevor ich mir das heute Abend noch genauer ansehe … (ich muss erst mal ein paar Stunden arbeiten die Pause ist um) … eine Anmerkung. Wenn Du die Programme, die Du beenden willst selbst startest, kannst Du das Handle schon beim Start bekommen, Shell ist nämlich eine Funktion!

Statt …
Shell "C:\Program Files\Intermec\LabelShop Ultra

schreib …
Handle = Shell ("C:\Program Files\Intermec\LabelShop Ultra)

Klammer nicht vergessen!

Und Du musst das Handle nicht suchen, der Titel kann Dir egal sein. :smile:

Gruß, Rainer

Hallo,

so, ich habe doch noch einen Moment Zeit gefunden, den Beitrag richtig zu lesen. :smile: Die asynchrone Verarbeitung wird Pobleme bereiten, das ist gar nicht schön, sich darauf zu verlassen, daß ein Programm nach einiger Zeit wohl fertig sein wird …

  1. er soll 2 programme öffnen (zum ausdrucken eines
    labels)(erledigt)

Kannst Du das denn nicht in Dein Programm einbauen? Das erledigt dann Deine anderen Probleme auch gleich mit. Ich drucke hier ein Barcodeetikett nach VDA - Odette … Code39. EAN kann och leider nicht, falls Du das brauchst …

also deine variante funktioniert schon blos bei der lableshop
datei frägt er ob man speicherwill er soll es aber nicht
fragen sonder nur schließen ohne zu speichern

Hmmm. Wenn Du das Programm wirklich benötigst, würde ich mir mal die Dokumentation ansehen, ob man das mit Parametern aufrufen kann, die diese Frage unterdrücken. Wenn nicht, musst Du noch das Handle des Fensters suchen, das da stört und das auch schließen. Das fenster wird ja wohl aufpoppen und in den Vordergrund springen, das Handle ist dann mit GetActiveWindow leicht zu bekommen. (Beispielcode folgt, ich sitze am falschen Rechner. :smile:)

Noch ne frage geht es das ich das programm durch ein enter
drücken starte? also bis jetzt muss ich ja in des text feld
klicken damit es startet (Private Sub SN_click())
das währe dann echt cool da der barcodescanner zuerst die
zahlen hinschreibt und dann ein enter drückt…

Aber klar geht das. Das Textfeld, in das der Barcodescanner den Text schreibt, kennt das Ereignis KeyDown. Du musst nur …

Private Sub Textfeld_KeyDown( … )
If KeyCode = 13 Then
'Dein Code
Endif
End Sub

… Deinen Code in die richtige Prozedur schreiben.

Erzähl aber erst mal etwas über das Barcodeetikett, mal sehen, ob Du das externe Programm wirklich brauchst. :smile:

Gruß, Rainer

Hallo,

noch 'n Frage … Deine ‚Zeitsteuerung‘ beschäftigt mich, gefällt mir gar nicht. :frowning:

Gibt es denn in dem Druckprogramm eine sichtbare Rückmeldung, daß der Druck erfolgreich beendet ist? Wenn man das lesen kann, ist die Zeitsteuerung weitgehend überflüssig und der Ablauf wird stabiler.

Gruß, Rainer

Guten Morgen

Gibt es denn in dem Druckprogramm eine sichtbare Rückmeldung,
daß der Druck erfolgreich beendet ist? Wenn man das lesen
kann, ist die Zeitsteuerung weitgehend überflüssig und der
Ablauf wird stabiler.

ich würde sagen nein da ich den druckauftrag durch 2 tasten drücks starte also F6 und danach enter (mach ich durch Workarounder da ich keine andere möglichkeit weiß oder kann ich von VB aus an ein programm die befehle senden?)

Hallo,

so, ich habe doch noch einen Moment Zeit gefunden, den Beitrag
richtig zu lesen. :smile: Die asynchrone Verarbeitung wird Pobleme
bereiten, das ist gar nicht schön, sich darauf zu verlassen,
daß ein Programm nach einiger Zeit wohl fertig sein wird …

hab ich mir auch schon gedacht aber ich weiß keine möglichkeit wie ich das verhindern kann oder gibt es ne abfrage ob das fenster geöffnet ist?

Kannst Du das denn nicht in Dein Programm einbauen? Das
erledigt dann Deine anderen Probleme auch gleich mit. Ich
drucke hier ein Barcodeetikett nach VDA - Odette … Code39.
EAN kann och leider nicht, falls Du das brauchst …

nein geht leider nich des Lable hat nen vorgefertigten Skin auf dem
4 verschiedene Barcods drauf sind und noch n paar zeihlen text ausdem funktioniert der „Drucker“ nur in verbindung mit Lableshop + dongel

Hmmm. Wenn Du das Programm wirklich benötigst, würde ich mir
mal die Dokumentation ansehen, ob man das mit Parametern
aufrufen kann, die diese Frage unterdrücken. Wenn nicht, musst
Du noch das Handle des Fensters suchen, das da stört und das
auch schließen. Das fenster wird ja wohl aufpoppen und in den
Vordergrund springen, das Handle ist dann mit GetActiveWindow
leicht zu bekommen. (Beispielcode folgt, ich sitze am falschen
Rechner. :smile:)

ich google einfach mal danach danke

mfg
Uma

Hi

^^ arrg hab ich net gewust das des so einfach get naja ich lass des jetzt aber mal so funktioniert ja genauso

mfg
Uma