Process List Tool - Brauche eure Hilfe

  • Hallo Leute, ich bin grade dabei ein kleines Tool zu schreiben und komme nicht weiter.

    Ich habe eine GUI-Oberfläche erstellt und habe eine ProcessList eingebaut.

    Nun möchte ich wenn Programm/Prozess wordpad.exe offen ist und es in der ProcessList erscheint und ich es ANKLICKE.

    Und dannach HIDE drücke, das sich das Programm auch Hidet. Jedoch habe ich keinen blassen Schimmer wie ich das anstellen soll.
    Was muss ich nun in der Func unten eingeben das der MARKIERTE Prozess sich hiden soll. NUR DER MARKIERTE

    Ich bedanke mich schonmal jetzt herzlich bei allen die mir helfen!

    Hier der Source Code.

    2 Mal editiert, zuletzt von LANCeR (17. Februar 2010 um 14:50)

  • HIDE gehört zu Fenstern (>Win<setstate win>window>Fenster)

    PS: Woher hast du die Idee mit dem Taskmanager :D Und vorallem mit dem HIDE :D Ich sehe jetzt den zweiten der versucht auch sone Art Taskmanager wie ich zu machen, aber OK. Jeder hat das Recht zu lernen :P

  • Zitat

    HIDE gehört zu Fenstern (>Win<setstate win>window>Fenster)

    Nicht schlimm, wordpad läst sich auch hiden :)


    Zitat

    PS: Woher hast du die Idee mit dem Taskmanager :D Und vorallem mit dem HIDE :D Ich sehe jetzt den zweiten der versucht auch sone Art Taskmanager wie ich zu machen, aber OK. Jeder hat das Recht zu lernen :P


    Ja ich habe großen Spaß daran kleinere Programme zu erstellen.
    Deshalb möchte ich jetzt ein kleines Tool machen das ein bestimmtes Programm HIDET und wieder sichtbar machen kann, in diesem fall wordpad.exe.
    Die Liste habe ich eingebaut weil man mehrere wordpad.exe aufmachen kann und ich nun nicht alle HIDEN will sondern nur das markierte in der Prozess liste :D

  • Es gibt ja auch mehrere Fenster in der Winlist()

    Und falls du es mit den Fenstern machen willst hast du das Beispiel kleiner Taskmanager von mir bei Skripte.
    Aber ich glaube mit Prozessen kann man nicht HIDEN nur Fenster und ich glaube man kann auch nicht Fenstertitel von Prozess herausfinden.

  • ... also ich habe eine Prozess liste erstellt.

    Es werden aber nur die wordpad.exe prozesse angezeigt, weil ich dahinter (wordpad.exe) geschrieben habe.

    Nun könnte ich einfach sagen, wenn ich auch hide drücke sollen alle prozesse die (wordpad.exe) heißen gehidet werden.

    Wenn ich 1x Wordpad geöffnet haben würde, wäre das kein problem. Aber wenn ich nun Wordpad 4 oder 5x geöffnet habe.

    Will ich gerne das sich NUR das Wordpad Hidet was ich in der Prozessliste MARKIERT/ANGEKLICKT habe.

    Nur ich weiß leider nicht wie ich dies bewerkstellige. Deshalb frage ich hier auch nach :)

    edit// ich schaue mir mal das script an

  • So?

    Spoiler anzeigen
    [autoit]

    #include <GUiListBox.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ###
    $Form1 = GUICreate("Dialog", 268, 226, 303, 219)
    GUISetIcon("D:\009.ico")
    $Group1 = GUICtrlCreateGroup("Tools", 8, 8, 97, 177)
    $Button1 = GUICtrlCreateButton("Show", 16, 24, 75, 25, 0)
    $Button2 = GUICtrlCreateButton("Hide", 16, 56, 75, 25, 0)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group2 = GUICtrlCreateGroup("Process List", 112, 8, 137, 177)
    $List1 = GUICtrlCreateList("", 120, 24, 121, 149)
    $hList1 = GUICtrlGetHandle($List1)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    $altlist = ProcessList("")

    [/autoit] [autoit][/autoit] [autoit]

    While 1 * Sleep(50)
    $plist = ProcessList("notepad.exe")
    If $altlist[0][0] <> $plist[0][0] Then
    _process()
    EndIf
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $Button2 ; Hide Button
    _hide1()
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _hide1(); Hide Button
    $CurSel = _GUICtrlListBox_GetCurSel($hList1)
    $GetText = _GUICtrlListBox_GetText($hList1, $CurSel)
    ConsoleWrite($GetText)
    If $GetText = "notepad.exe" Then
    WinSetState("Unbenannt - Editor", "", @SW_HIDE)
    EndIf
    EndFunc ;==>_hide1

    [/autoit] [autoit][/autoit] [autoit]

    Func _process()
    For $i = 1 To $plist[0][0]
    GUICtrlSetData($List1, $plist[$i][0])
    Next
    EndFunc

    [/autoit]

    Nicht die beste Lösung, denn ich weiß nicht, wie ich das Fenst per PID verstecken kann :S

  • @Pinguin94

    Ja! Genau das suche ich, es klappt auch wunderbar.
    Nur nun sehe ich grade das es noch ein Problem gibt undzwar.

    Wenn ich NOTEPAD.EXE zwei mal starte. Ist in der Prozesslist leider nur 1x notepad.exe :/

    kann mir einer erklären warum das so ist, bzw wie man das ändern kann

  • [Blockierte Grafik: http://cartan.ca.ohost.de/notepad.GIF]
    Bei mir sieht das anders aus... Was hast du denn für ein System?

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Cartan12

    Tut mir leid, ich habe mich wohl etwas undeutlich ausgedrückt.
    Ich habe gemeint, das in meinem Programm der Prozess nur 1x angezeigt wird.
    Im Taskmanager wird er natürlich 2x angezeigt :)

  • [autoit]

    #include <GUIConstants.au3>
    #Include <GuiListBox.au3>

    [/autoit][autoit][/autoit][autoit]

    #Region ### START Koda GUI section ###
    $Form1 = GUICreate("Dialog", 268, 226, 303, 219)
    GUISetIcon("D:\009.ico")
    $Group1 = GUICtrlCreateGroup("Tools", 8, 8, 97, 177)
    $Button1 = GUICtrlCreateButton("Show", 16, 24, 75, 25, 0)
    $Button2 = GUICtrlCreateButton("Hide", 16, 56, 75, 25, 0)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group2 = GUICtrlCreateGroup("Process List", 112, 8, 137, 177)
    $List1 = GUICtrlCreateList("", 120, 24, 121, 149)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $plist = ProcessList("notepad.exe")
    For $i=1 To $plist[0][0]
    _GUICtrlListBox_AddString($List1, $plist[$i][0])
    Next

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $Button2 ; Hide Button
    _hide1 ()
    EndSwitch
    WEnd

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _hide1 (); Hide Button

    [/autoit][autoit][/autoit][autoit]

    sleep (1000)
    EndFunc

    [/autoit]
    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Cartan12
    Okay deine Source funktioniert :) beide Prozesse werden angezeigt.

    Könntest du bitte noch die HIDE funktion mit einbauen?


    Edit// ich brauche nurnoch die Hide Funktion, wie schaff ich das? :/

    Einmal editiert, zuletzt von LANCeR (12. Februar 2010 um 23:10)

  • Habe es mal zuende gebaut

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <GUIConstants.au3>
    #include <GuiListBox.au3>

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ###
    $Form1 = GUICreate("Dialog", 268, 226, 303, 219)
    GUISetIcon("D:\009.ico")
    $Group1 = GUICtrlCreateGroup("Tools", 8, 8, 97, 177)
    $Button1 = GUICtrlCreateButton("Show", 16, 24, 75, 25, 0)
    $Button2 = GUICtrlCreateButton("Hide", 16, 56, 75, 25, 0)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group2 = GUICtrlCreateGroup("Process List", 112, 8, 137, 177)
    $List1 = GUICtrlCreateList("", 120, 24, 121, 149)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    AdlibRegister("Update", 3000)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $Button2 ; Hide Button
    _hide1()
    Case $Button1
    _Show()
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _hide1(); Hide Button
    $aSelcet = GUICtrlRead($List1)
    $aSelcet = StringSplit($aSelcet, "|", 2)
    AdlibUnRegister()
    $plist = Update()
    $winlist = WinList()
    For $x = 0 To $winlist[0][0]
    If _ProcessGetPidByWindow($winlist[$x][1]) = $aSelcet[1] Then WinSetState($winlist[$x][0], "", @SW_HIDE)
    Next
    AdlibRegister("Update")
    EndFunc ;==>_hide1

    [/autoit] [autoit][/autoit] [autoit]

    Func _Show()
    $aSelcet = GUICtrlRead($List1)
    $aSelcet = StringSplit($aSelcet, "|", 2)
    AdlibUnRegister()
    $plist = Update()
    $winlist = WinList()
    For $x = 0 To $winlist[0][0]
    If _ProcessGetPidByWindow($winlist[$x][1]) = $aSelcet[1] Then WinSetState($winlist[$x][0], "", @SW_SHOW)
    Next
    AdlibRegister("Update")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func Update()
    GUICtrlSetData($List1, "")
    $plist = ProcessList("notepad.exe")
    For $i = 1 To $plist[0][0]
    _GUICtrlListBox_AddString($List1, $plist[$i][0] & "|" & $plist[$i][1])
    Next
    Return $plist
    EndFunc ;==>Update

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name: _ProcessGetPidByWindow($WindowHandle)
    ; Description:: fetches the PID of a process by its windows handle
    ; Parameter(s): $WindowHandle : Handle of the process' window
    ; Requirement(s): DLL-Functions (Since v 3.2 ? )
    ; Return Value(s): Process ID
    ; Author(s): Prog@ndy
    ;
    ;===============================================================================
    ;

    [/autoit] [autoit][/autoit] [autoit]

    Func _ProcessGetPidByWindow($WindowHandle)
    $ptr = DllStructCreate("long")
    $ret = DllCall("user32.dll", "ptr", "GetWindowThreadProcessId", "hwnd", $WindowHandle, "long", DllStructGetPtr($ptr))
    $PID = DllStructGetData($ptr, 1)
    Return $PID
    EndFunc ;==>_ProcessGetPidByWindow

    [/autoit]

    Es aktualiesiert sich jetze automatisch

  • Danke Sprenger120 :D

    Also, das Programm an sich funktioniert jetzt.

    Jedoch habe ich kleinere Probleme festgestellt.

    Problem 1. Wenn ich zb 2x Notepad geöffnet habe und dann das Autoit tool starte, wird nichts in der liste angezeigt. Erst wenn ich dann wieder 1x notepad ausführe, zeigen sich die prozesse in der liste.

    Problem 2. wenn ich ein prozess in der liste anklicke/markiere, wird der nach 3 sekunden wieder "entmarkiert"

    Problem 3: Wenn ich auf HIDE oder SHOW drücke , wenn nichts markiert ist. Stürzt das Programm ab mit folgenden Fehlermeldungen

    [Blockierte Grafik: http://www.imagebanana.com/img/mayxmx7u/fehlermeldungen.PNG]

    3 Mal editiert, zuletzt von LANCeR (16. Februar 2010 um 12:18)

  • Edit// ja lag an der alten version, aber habe jetzt ja neue probleme, wie man im oberen post sieht :D

  • Problem 1. Wenn ich zb 2x Notepad geöffnet habe und dann das Autoit tool starte, wird nichts in der liste angezeigt.


    Warte mal 5 sekunden

    Problem 2. wenn ich ein prozess in der liste anklicke/markiere, wird der nach 3 sekunden wieder "entmarkiert"


    Das liegt an der Updatefunktion die die Liste neu befüllt aber ich ändere das mal noch


    Problem 3: Wenn ich auf HIDE oder SHOW drücke , wenn nichts markiert ist. Stürzt das Programm ab mit folgenden Fehlermeldungen

    Ich setze mich mal ran wenn ich wieder @Home bin