Progamme über PID ansprechen

02/28/2013 10:12 luli-1#1
Folgendes Problem.

Ich habe mehrere instanzen eines Programms mit dem selben (Titel)Namen.
Daher kann ich leider nicht mit Fenstertiteln arbeiten womit ich einfach WinSetState benutzen könnte.

ich habe über eine Schleife jetzt mir die dementsprechenden PID rausgefischt finde aber keine lösung wie ich die PID jetzt beutzen kann um die fenster auf @SW_HIDE bzw wieder auf @SW_SHOW zu setzen hat jemand eine lösung ?

Wäre über jede hilfe dankbar!


Mit freundlichen Grüßen

Luli1
02/28/2013 12:39 lolkop#2
Quote:
Originally Posted by luli-1 View Post
Folgendes Problem.

Ich habe mehrere instanzen eines Programms mit dem selben (Titel)Namen.
Daher kann ich leider nicht mit Fenstertiteln arbeiten womit ich einfach WinSetState benutzen könnte.

ich habe über eine Schleife jetzt mir die dementsprechenden PID rausgefischt finde aber keine lösung wie ich die PID jetzt beutzen kann um die fenster auf @SW_HIDE bzw wieder auf @SW_SHOW zu setzen hat jemand eine lösung ?

Wäre über jede hilfe dankbar!


Mit freundlichen Grüßen

Luli1
ein prozess kann sehr viele fenster haben, wodurch eine derartige funktion nicht existieren kann...

du solltest vielleicht lieber mit WinList arbeiten, um tatsächlich alle fenster auf einen schlag auszulesen...

alternativ kannst du natürlich mit exponentiell erhöhtem aufwand, jeweils alle fenster zu jedem prozess bestimmen, indem du zunächst eine prozess liste erstellst, und danach per winlist alle fenster auf dem pc durchläufst, und diese auf die zugehörige pid prüfst, um so eine eindeutige zuordnung erstellen zu können.
02/28/2013 14:54 luli-1#3
Quote:
Originally Posted by lolkop View Post
ein prozess kann sehr viele fenster haben, wodurch eine derartige funktion nicht existieren kann...

du solltest vielleicht lieber mit WinList arbeiten, um tatsächlich alle fenster auf einen schlag auszulesen...

alternativ kannst du natürlich mit exponentiell erhöhtem aufwand, jeweils alle fenster zu jedem prozess bestimmen, indem du zunächst eine prozess liste erstellst, und danach per winlist alle fenster auf dem pc durchläufst, und diese auf die zugehörige pid prüfst, um so eine eindeutige zuordnung erstellen zu können.
die zugehörigen PID habe wie wiegesagt schon ich brauch nurnoch hilfe wie ich sie dazu verwenden kann um diese fenster anzusprechen.(jeder prezess hat in diesemfall nur 1 fenster)
02/28/2013 15:01 lolkop#4
Quote:
Originally Posted by luli-1 View Post
die zugehörigen PID habe wie wiegesagt schon ich brauch nurnoch hilfe wie ich sie dazu verwenden kann um diese fenster anzusprechen.(jeder prezess hat in diesemfall nur 1 fenster)
deine denkweise ist wie gesagt schlecht...

um die zugehörigen fenster zu einer pid zu ermitteln, musst du die gesamtmenge an fenstern durchlaufen.... es wäre deutlich sinnvoller direkt mit dieser zu arbeiten, um dir so eine schleife zu ersparen.

in der regel speichern alle prozesse ihre eigenen fensterhandles irgendwo im speicher. alternativ könntest du also auch einfach das fensterhandle aus dem speicher auslesen... das ändert aber nichts darann das es viel effizienter wäre direkt mit einer liste der fenster handles zu arbeiten...

um die lästige raterei, was du überhaupt machst abzukürzen, könntest du ja einfach mal dein script in kombination mit dem windowinfo stats deines ziels zeigen, damit man dir auch helfen kann...
02/28/2013 15:29 luli-1#5
Quote:
Originally Posted by lolkop View Post
deine denkweise ist wie gesagt schlecht...

um die zugehörigen fenster zu einer pid zu ermitteln, musst du die gesamtmenge an fenstern durchlaufen.... es wäre deutlich sinnvoller direkt mit dieser zu arbeiten, um dir so eine schleife zu ersparen.

in der regel speichern alle prozesse ihre eigenen fensterhandles irgendwo im speicher. alternativ könntest du also auch einfach das fensterhandle aus dem speicher auslesen... das ändert aber nichts darann das es viel effizienter wäre direkt mit einer liste der fenster handles zu arbeiten...

um die lästige raterei, was du überhaupt machst abzukürzen, könntest du ja einfach mal dein script in kombination mit dem windowinfo stats deines ziels zeigen, damit man dir auch helfen kann...

Mh ich weiß nicht ob wir an einander vorbei reden oder ob ich hier grade grade einfach falsch denke. Also ich habe über process list wie du auch schon geschrieben hattest die nötigen infos zu meinem (in dem fall 8 progammen) rausgefunden.Da ich damit aber nur die pid und den titel zurück bekomme und die titel bei allen 8 gleich sind kann ich damit nichts anfangen. Also versuch ichs jetzt mit den pids. Jetzt ist meine frage wie ich mit den pids ein zurgiff auf das fenster bekomme (command) damit ich es auf hide setzen kann

weil z.b. WinSetState($list[$i][1]),"",@SW_HIDE) würde nicht funktionieren weil die methode mit titel arbeitet

und WinSetState($list[$i][0]),"",@SW_HIDE) würde nicht funktionieren weil alle fenster den gleichen titel haben und essomit nur eins davon anspricht

ps: über windows info bekomm ich nicht viele infos raus zummindest keine die ich verwenden könnte
02/28/2013 16:26 butter123#6
[Only registered and activated users can see links. Click Here To Register...]
02/28/2013 17:25 lolkop#7
Quote:
Originally Posted by luli-1 View Post
Mh ich weiß nicht ob wir an einander vorbei reden oder ob ich hier grade grade einfach falsch denke. Also ich habe über process list wie du auch schon geschrieben hattest die nötigen infos zu meinem (in dem fall 8 progammen) rausgefunden.Da ich damit aber nur die pid und den titel zurück bekomme und die titel bei allen 8 gleich sind kann ich damit nichts anfangen. Also versuch ichs jetzt mit den pids. Jetzt ist meine frage wie ich mit den pids ein zurgiff auf das fenster bekomme (command) damit ich es auf hide setzen kann

weil z.b. WinSetState($list[$i][1]),"",@SW_HIDE) würde nicht funktionieren weil die methode mit titel arbeitet

und WinSetState($list[$i][0]),"",@SW_HIDE) würde nicht funktionieren weil alle fenster den gleichen titel haben und essomit nur eins davon anspricht
ich verstehe schon ganz genau was du machst... das problem, welches ich versuche dir zu erklären ist, das das leider sehr unsinnig ist...

man könnte deinen wunsch sicher so lösen:
Code:
Func getWindowHandlesFromPid($pid)
	Local $index=0, $return[1]=[-1], $hwnds=WinList()
	For $i=1 To $hwnds[0][0]
		If WinGetProcess($hwnds[$i][1])=$pid Then
			If $return[0]<>-1 Then
				$inxdex = UBound($return)
				ReDim $return[$index+1]
			EndIf
			$return[$index] = $hwnds[$i][1]
		EndIf
	Next
	Return $return
EndFunc
das ganze führt aber wie bereits gesagt zu einer sinnlosen, exponentiellen aufwandssteigerung, da man auch von vornherein mit WinList arbeiten kann...

Quote:
Originally Posted by luli-1 View Post
ps: über windows info bekomm ich nicht viele infos raus zummindest keine die ich verwenden könnte
jedes fenster in windows besitzt einen titel und einen class-name. beides in kombination reicht IMMER aus ein fenster genau zu identifizieren.

arbeitet man mit fenster operationen, so sollte man immer über WinList starten, da es deutlich effizienter ist, einem fenster einen prozess zuzuordnen, als andersherum.
fenster->prozess <-- 1 befehl
prozess->fenster <-- n befehle (wobei n = anzahl aller geöffneten fenster)

man löst das ganze also entweder mit einem auszuführendem befehl oder mit sehr viel mehr ausführungen, so wie du es geplant hast...
02/28/2013 17:48 luli-1#8
Quote:
Originally Posted by lolkop View Post

das ganze führt aber wie bereits gesagt zu einer sinnlosen, exponentiellen aufwandssteigerung, da man auch von vornherein mit WinList arbeiten kann...



jedes fenster in windows besitzt einen titel und einen class-name. beides in kombination reicht IMMER aus ein fenster genau zu identifizieren.

arbeitet man mit fenster operationen, so sollte man immer über WinList starten, da es deutlich effizienter ist, einem fenster einen prozess zuzuordnen, als andersherum.
fenster->prozess <-- 1 befehl
prozess->fenster <-- n befehle (wobei n = anzahl aller geöffneten fenster)

man löst das ganze also entweder mit einem auszuführendem befehl oder mit sehr viel mehr ausführungen, so wie du es geplant hast...


Achso! jetzt versteh ich was du meinst. Ja die Lösung ist ja eigentlich ganz einfach.... wusste nicht das ich einfach das handle benutzen kann statt des Titels....

danke vielmals... es klappt :)
02/28/2013 19:03 lolkop#9
Quote:
Originally Posted by luli-1 View Post
Achso! jetzt versteh ich was du meinst. Ja die Lösung ist ja eigentlich ganz einfach.... wusste nicht das ich einfach das handle benutzen kann statt des Titels....

danke vielmals... es klappt :)
ich hoffe du hast verstanden, das ich das codebeispiel nur gepostet habe, um zu zeigen wie es NICHT gemacht werden sollte.
02/28/2013 19:14 luli-1#10
Quote:
Originally Posted by lolkop View Post
ich hoffe du hast verstanden, das ich das codebeispiel nur gepostet habe, um zu zeigen wie es NICHT gemacht werden sollte.
ja hab ich :) ärgere michs chon die ganze zeit über meine eigene dummheit :)
03/01/2013 16:51 -STORM-#11
Bin mir jetzt nicht sicher, ob ich dich richtig verstanden habe.
Gehört jedes Fenster zu einem eigenen Prozess, also sind die PIDs verschieden?
Wenn ja ginge es so:
Code:
Func _GetHwndFromPID($pid)
	Local $i, $winlist = WinList()
	For $i = 1 To $winlist[0][0]
		If WinGetProcess($winlist[$i][1]) = $pid And $winlist[$i][0] <> "" Then Return $winlist[$i][1]
	Next
	Return -1
EndFunc   ;==>_GetHwndFromPID