Auslesen der PID (Prozessname bekannt), VB6

Hallo,

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?

ja, klar. Hast Du doch schon. :smile: Du suchst mit FindWindow das Handle. Wenn Du Null zurück bekommst, wurde das Fenster nicht gefunden.

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

OK, war nur so 'ne Idee. Nicht, daß Du den ganzen Aufwand betriebst nur um einen Barcode auf ein Etikett zu bekommen und am Ende erzähle ich Dir, daß ich dafür 'ne feritge Lösung habe und Du frisst mich … :smile:

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

ähhh, sorry, http://activevb.de/cgi-bin/apiwiki/index.php?title=H…

den Link hätte ich auch gleich mit posten können …

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?)

klar, mit SendMessage machst Du doch nichts anderes.

Gruß, Rainer

; 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?)
; klar, mit SendMessage machst Du doch nichts anderes.

hey das löst ja gleich 2 probleme auf einmal :smiley:
ich muss dannn nur f6 enter und dann f3(is speichern) senden und dann kann ich des programm einfach so benden ohne das er die frage schreibt.
es ist egal ob er speichert oder nicht speichert…

das würde dann in etwa so funktionieren oder?

Dim wMsg As Long
wMsg = FindWindow(vbNullString, „Database Manager Me - [D:\ScanPrgramm\Fix Daten.MDB]“)
SendMessage wMsg, VK_F6, ByVal 0&, ByVal 0&
SendMessage wMsg, VK_RETURN, ByVal 0&, ByVal 0&
SendMessage wMsg, VK_F3, ByVal 0&, ByVal 0&

mfg
uma

Hallo,

das würde dann in etwa so funktionieren oder?

Dim wMsg As Long
wMsg = FindWindow(vbNullString, „Database Manager Me -
[D:\ScanPrgramm\Fix Daten.MDB]“)
SendMessage wMsg, VK_F6, ByVal 0&, ByVal 0&
SendMessage wMsg, VK_RETURN, ByVal 0&, ByVal 0&
SendMessage wMsg, VK_F3, ByVal 0&, ByVal 0&

nur fast. Ich komme im Moment nicht richtig klar damit, sieh Dir doch mal das Beispiel an, das müsste helfen.
http://www.activevb.de/tipps/vb6tipps/tipp0599.html

Gruß, Rainer

ich schau mir mal des beispiel an
kp wie lang des dauert aufjeden fall bin ich um 15 uhr weg nur daste weißt und komme erst wieder am 30.09 heim *kotz* so n scheiß teamtrening von der arbeit aus… und das ganze auch noch in Österreich… kein bock drauf

nich das du denkst ich melde mich nichtmehr
also dann vielen dank für die ganze hilfe

mfg
uma

Hi Uma,

ich schau mir mal des beispiel an
kp wie lang des dauert aufjeden fall bin ich um 15 uhr weg nur
daste weißt und komme erst wieder am 30.09 heim *kotz* so n
scheiß teamtrening von der arbeit aus… und das ganze auch
noch in Österreich… kein bock drauf

nich das du denkst ich melde mich nichtmehr

danke für’s bescheidsagen. Bis dahin habe ich das dann auch fertig, denn im Moment … wenn ich einen Text an das Notepad schicke, erscheit der als Fenstertitel und nicht im Text. Ich weiß aber, daß ich schon mal einen Code hatte, mit dem ich sämtliche Handles eines Programms aufgelistet habe.

Darum kann ich moch aber auch erst am Abend kümmern, hier ist es nämlich nicht viel anders als bei Dir, eine Kollegin krank und ich habe zwei Schreibtische … :smile:

Trotzdem viel Spaß uf der Dienstreise, wenn Du zurück bist, bekommen wir das Programm fertig und sauber zu Laufen, ohne Timer und ähnliche instabile Konstruktionen. Eine einfache Möglichkeit gäbe es nämlich noch, aber die ist unzuverlässig, so etwas bauen wir nicht. :smile:

Gruß, Rainer

Hallo,

so, der Code ist fertig. Das sollte Dir genügen, um Dein Problem komplett zu lösen.

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
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Const GW\_CHILD = 5
Const GW\_HWNDNEXT = 2
Const WM\_SETTEXT = &HC

Dim Handle As Long
Dim ChildHandle As Long
Dim Class\_String As String \* 250

Private Sub Form\_Load()
 Shell "C:\Winnt\System32\notepad.exe", 1
 DoEvents
 Handle = FindWindow(vbNullString, "Unbenannt - Editor")
 ChildHandle = GetWindow(Handle, GW\_CHILD)
' Do While ChildHandle 0
' GetClassName ChildHandle, Class\_String, 250
' ChildHandle = GetWindow(ChildHandle, GW\_HWNDNEXT)
' 'mit geeigneter Methode das richtige Handle suchen
' Loop
 SendMessage Handle, WM\_SETTEXT, 0, "Notepad"
 SendMessage ChildHandle, WM\_SETTEXT, 0, "Teststring"
 Sleep 10000
 SendMessage Handle, &H10, ByVal 0&, ByVal 0&
 End
End Sub

OK? Ich schütze den Artikel mal vorm archivieren, weil Du ja ein paar Tage nicht da bist …

Gruß, Rainer

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:

Hallo Rainer,

du suchst VB-Code um einen Prozess aufgrund seines Namens, z.B. Notepad.exe, zu orten, dessen PID zu erhalten?

Zitat:


Um zu ermitteln welche Prozesse im System laufen kannst du die ToolHelp32 API verwenden.
Anbei mal ein Codeschnippsel der Zeigt wie man die Prozesse Auflistet.
Nun ist es ein leichtes die ProcessID des (warscheinlich per Namen) gesuchten Prozesses zu ermitteln und entsprechend zu reagieren.

Quelle:

/t/feststellen-ob-ein-programm-laeuft/3259111

Naja, ist C-Code, aber ein API-Aufruf, fehlt nur die Umsetzung nach VB.

Gruß
Reinhard

Hallo Reinhard,

du suchst VB-Code um einen Prozess aufgrund seines Namens,
z.B. Notepad.exe, zu orten, dessen PID zu erhalten?

Nein. Die PID nützt nichts. Den Code haben wir in VB auch, die Prozesse auflisten ist kein Problem. Die Prozesse sollen beendet werden und ‚TerminateProzess‘ und ähnliches funktioniert bei XP nicht mehr.

Um einen Prozess von außen zu beenden muß man SendMessage verwenden und dazu benötigt man das Handle des Fensters.

Was ich nicht gefunden habe ist, wie ich mit der PID das Handle des Fensters finde. Alle Beispiele arbeiten entweder mit dem exe-Namen und der PID oder mit dem Handle und Fenstertitel/KlassenName.

Gruß, Rainer

Um einen Prozess von außen zu beenden muß man SendMessage
verwenden und dazu benötigt man das Handle des Fensters.

Was ich nicht gefunden habe ist, wie ich mit der PID das
Handle des Fensters finde. Alle Beispiele arbeiten entweder
mit dem exe-Namen und der PID oder mit dem Handle und
Fenstertitel/KlassenName.

Hallo Rainer,
ich kenne mich da nicht so aus. Ich habe Excel-Vba-Code mit APIs, den starte ich und der listet mir Zellenweise alle Prozesse auf. Sogar mittels Spaltenversetzung nach rechts auch ob es eine Unter-Class o.ä. ist.
Die Schachteltiefe geht nach rechts bis G, also 7 tief, müssen wohl Unter-Unter-Unter-…Unterklassen sein, k.A.

Also jetzt, nur für Notepad erhalte ich folgende Informationen in den drei Zellen:

 A B C
"Class : Notepad
Caption : Unbenannt - Editor
Windowhandle : 1377684
Left : 158 Top : 261
Right : 926 Bottom : 791
Stil : Sichtbar
Stil : Titelleiste
Stil : Systemmenü
Stil : Minimierbox
Stil : Maximierbox
EXE : notepad.exe
PID : 1772
ThreadID : 2456"


 "Class : Edit
 Caption : 
 Windowhandle : 1705352
 Left : 162 Top : 311
 Right : 922 Bottom : 787
 Stil : Sichtbar
 Stil : V-Scrollbar
 Stil : H-Scrollbar
 EXE : notepad.exe
 PID : 1772
 ThreadID : 2456"


 "Class : msctls\_statusbar32
 Caption : 
 Windowhandle : 263796
 Left : 162 Top : 764
 Right : 922 Bottom : 787
 EXE : notepad.exe
 PID : 1772
 ThreadID : 2456"

Wäre dir das hilfreich um es evtl. in VB umzuwandeln?
Gruß
Reinhard

Hallo

so bin wieder da hab den code gerade getestet und funktioniert
nur ein problem hab ich immer noch das er frägt ob man speichern will oder nicht
des prob kann man einfach lösen wenn man speichert (f3 drücken)

so wie kann ich jetzt da f3 hinsenden
eigentlich doch so?
SendMessage ChildHandle, WM_SETTEXT, 0, „VK_F3“

des is doch die Tabelle mit den Virtual key codes für VB?
http://msdn2.microsoft.com/en-us/library/ms645540.aspx

Hallo,

SendMessage ChildHandle, WM_SETTEXT, 0, „VK_F3“

des is doch die Tabelle mit den Virtual key codes für VB?
http://msdn2.microsoft.com/en-us/library/ms645540.aspx

die Liste sehe ich zum Ersten mal. Nein VB6 versteht das nicht, das muß .NET sein. Such mal in der Hilfe von VB6 mach ‚Send Keys‘, da findest Du die richtige Liste mit geschweiften Klammern. (Aber nicht Send Keys verwenden!!! Das ist instabil, habe ich absichtlich nicht erwähnt!!!)

Gruß, Rainer

Hallo,

habs grad getestet

in der liste steht einfach nur {F3} für f3

hab dann also
SendMessage ChildHandle, WM_SETTEXT, 0, „{F3}“
rengeschrieben

macht er aber net besser gesagt er macht gar nix
mfg
uma

Hallo,

in der liste steht einfach nur {F3} für f3

hab dann also
SendMessage ChildHandle, WM_SETTEXT, 0, „{F3}“
rengeschrieben

macht er aber net besser gesagt er macht gar nix

hmmm, damit habe ich auch keine Erfahrung, aber Abhilfe. :smile:

Es geht ja nur um das eine Zeichen und dann soll das hier gehen:

Const WM\_CHAR = &H102

SendMessage ChildHandle, WM\_CHAR, 123, 0

123 ist der ASCII von F3. Wenn wir nicht wissen, wie man die Taste als Text sendet, senden wir eben ein Chr$(123) :smile:

Dabei fällt mir auf, daß die Null jetzt an der anderen Stelle steht. Ich habe nichts zum Testen, wenn es nicht geht, experimentiere mal, tausche die ‚0‘ und die ‚123‘ aus. Auch in deinem Beispiel …

SendMessage ChildHandle, WM_SETTEXT, 0, „{F3}“

kannst Du mal versuchen, ob es anders herum geht …

SendMessage ChildHandle, WM_SETTEXT, „{F3}“, 0&

(0& damit die API weiß, daß da ein Long übergeben wird)

Ich weiß noch, daß mir neulich beim Testen aufgefallen war, daß in dem Beispiel von AVB da die Position an einer Stelle im Code vertauscht war.

Gruß, Rainer

Hallo,

hmm hab alles in wirklich jeder konstellation getestet funkt aber net bringt dauernt Fehler ungültiger befehl der hat irgent ein prob bei dem , 0 hab da auch schon getauscht usw und 0& aber
nix geht immer wieder fehler

mfg
uma

Hallo,

hmm hab alles in wirklich jeder konstellation getestet funkt
aber net bringt dauernt Fehler ungültiger befehl der hat
irgent ein prob bei dem , 0 hab da auch schon getauscht usw
und 0& aber
nix geht immer wieder fehler

ich probier mal noch etwas aus und melde mich dann mit einem vollständigen Code wieder. Das wird aber etwas dauern.

Gruß, Rainer

Hallo,
ich hab’s allein nicht geschafft und mir auf http://www.ActiveVB.de helfen lassen. Ich hoffe, das geht noch durch … Beispiel: 2 Formen.

Form1 hat zwei Steuerelemente ‚Command1‘ und ‚Command2‘.
Form2 hat ein Steuerelement ‚Command1‘.

Code für Form1:

Option Explicit

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

Private Declare Function FindWindowEx Lib "user32" \_
Alias "FindWindowExA" (ByVal hWnd1 As Long, \_
ByVal hWnd2 As Long, ByVal lpsz1 As String, \_
ByVal lpsz2 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\_KEYDOWN = &H100

Private Sub Command1\_Click()
 Dim Handle As Long
 Dim Btn\_Handle As Long
 Handle = FindWindow(vbNullString, "Form2")
 Btn\_Handle = FindWindowEx(Handle, ByVal 0&, vbNullString, "Schalter")
 SendMessage Btn\_Handle, WM\_KEYDOWN, 113&, 0&
End Sub

Private Sub Command2\_Click()
 Dim Handle As Long
 Dim Btn\_Handle As Long
 Handle = FindWindow(vbNullString, "Form2")
 Btn\_Handle = FindWindowEx(Handle, ByVal 0&, vbNullString, "Schalter")
 SendMessage Btn\_Handle, WM\_KEYDOWN, 114&, 0&
End Sub

Private Sub Form\_Load()
 Form2.Show
 Form2.KeyPreview = True
 Form2.Command1.Caption = "Schalter"
 Form1.Command1.Caption = "Form2 rot schalten"
 Form1.Command2.Caption = "Form2 blau schalten"
End Sub

Code für Form2:

Option Explicit

Private Sub Command1\_KeyDown(KeyCode As Integer, Shift As Integer)
 If KeyCode = 113 Then
 Me.BackColor = vbRed
 ElseIf KeyCode = 114 Then
 Me.BackColor = vbBlue
 End If
End Sub

Du kannst entweder den Button auf Form2 anklicken und ‚F2‘ - ‚F3‘ tippen, die Farbe der Form2 wird immer zwischen rot und blau wechseln, oder alternativ auf Form1 die Button klicken, Form2 verhält sich wie beim tippen der Tasten. Das dürfte Dein Problem lösen.

Gruß, Rainer