Ueberpruefen ob Prozess reagiert

  • Hi,
    ich hab n Problem und zwar will ich ueberpruefen ob ein bestimmtes Fenster noch reagiert
    also wenn im Taskmanager da steht "not responding" will ich es beenden und neustarten.
    bei meinem Programm wird im titel das "not responding" aber nicht angezeigt. (das heist somit kann ichs nich herrausfinden)
    mir wurde auch vorgeschlagen das fenster zu verschieben und dann zu ueberpruefen ob das gelungen ist, aber das geht ja nich wenn es minnimiert ist.

    hat jemand nen Vorschlag?

    LG
    Murphy

  • Bis jetzt sollte das funktionieren (Es könnte aber sein, das MS den Befehl irgendwann entfernt)

    [autoit]

    Func _IsHungAppWindow($hWnd)
    Local $aResult = DLLCall("User32.dll", "bool", "IsHungAppWindow", "hwnd", $hWnd)
    If @error Then Return SetError(1,0,0)
    Return $aResult[0]
    EndFunc

    [/autoit]

    Edit: So sollte es auch gehen, habe es aber nicht getestet:

    [autoit]

    Func _IsWindowResponding($hWnd)
    Local $aRes = DllCall("User32.dll", "lresult", "SendMessageTimeoutW", "hwnd", $hWnd, "uint", 0, "WPARAM", 0, "LPARAM", 0, "UINT", BitOR(0x0002, 0x0008), "UINT", 5000, "ptr", 0)
    If @error Then Return SetError(1,0,0)
    Return $aRes[0]<>0
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von progandy (28. November 2010 um 23:52)

  • @ progandy
    das klingt ja sehr vielversprechend. funktioniert bei mir aber nich :( liefert immer false auch wenn der prozess noch laeuft)

    Spoiler anzeigen
    [autoit]

    MsgBox(0,"",_IsHungAppWindow("Server1.exe"))
    MsgBox(0,"",_IsHungAppWindow("bin32\Server1"))

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

    MsgBox(0,"",_IsWindowResponding("Server1.exe"))
    MsgBox(0,"",_IsWindowResponding("bin32\Server1"))

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

    Func _IsHungAppWindow($hWnd)
    Local $aResult = DLLCall("User32.dll", "bool", "IsHungAppWindow", "hwnd", $hWnd)
    If @error Then Return SetError(1,0,0)
    Return $aResult[0]
    EndFunc

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

    Func _IsWindowResponding($hWnd)
    Local $aRes = DllCall("User32.dll", "lresult", "SendMessageTimeoutW", "hwnd", $hWnd, "uint", 0, "WPARAM", 0, "LPARAM", 0, "UINT", BitOR(0x0002, 0x0008), "UINT", 5000, "ptr", 0)
    If @error Then Return SetError(1,0,0)
    Return $aRes[0]<>0
    EndFunc

    [/autoit]

    BugFix
    du kannst kein programm zum crashen bringen?
    moment ich schrieb dir schnell eins :P

    [autoit]

    while 1
    wend

    [/autoit]

    und danke fuer die ganzen andren vorschlaege aber bei mir funtktioniert keins von denen :(

    //Edit:

    also das Programm stuerzt ab und tut nich "nichmehr responden"
    also es landet in keiner schleiffe. oder so. aber erkennen koennen muss man das doch irgendwie.

    hiermal n screenshot

    Einmal editiert, zuletzt von Murphy9904 (29. November 2010 um 16:34)

  • Du hast die Funktionen auch falsch verwendet. Beide Funktionen erwarten ein Fensterhandle (die Rückgabe von z.B. WinExists)

  • ah ok - gut moment....

    WinGetHandle meinst du warscheinlich
    weil winexsist gibt 0 oder 1 zurueck

    jetzt erkennt er zumindest mal dass er reagiert .. aber leider auhc wenn das Programm gecrashed is..

    [autoit]

    MsgBox(0,"",_IsHungAppWindow(WinGetHandle("bin32\Server1")));--> Liefert mir immer 0
    MsgBox(0,"",_IsWindowResponding(WinGetHandle("bin32\Server1")));--> Liefert mir immer true

    [/autoit]

    irgendwas stimmt da noch nich sind in dieser dll noch paar andre funktionen drinne? - kann ich die irgendwo angucken?

  • Ja, klar. Ich hatte irgendwie im Kopf, dass WinExists ebenfalls das Handle liefert. Das habe ich mit WinWait(Active) verwechselt