Windows Live Messenger anzeigen

  • Hallöchen ;)

    folgendes Problem:
    ich möchte gerne den Windows Live Messenger 2009, der als Trayicon in der Taskleiste geöffnet ist durch ein Macro bspw. "SW_SHOW" anzeigen lassen. Nur leider funktioniert hierbei kein einziges Macro.

    Ziel ist es, was auch mit anderen Fenster funktioniert, von der laufenden Applikation die *.exe-Datei auszulesen und den Dateipfad abzuspeichern um den Pfad dann anschließend über den Explorer zu öffnen.

    Aktiviere ich nun Msn Live Messenger, sodass dieser in der Taskleiste als Fenster erscheint funktioniert das oben beschriebene Auslesen.

    Ich schaffe es nur eben nicht das als Trayicon minimierte Fenster wieder anzeigen zu lassen. Hoffe ihr habt eine pfiffige Lösung die ich bisher übersehen habe =)

    Vielen Dank im voraus

    Gruß Chris

    2 Mal editiert, zuletzt von blueangel1610 (9. Dezember 2009 um 00:21)

  • Danke zunächst einmal für deine schnelle Antwort, nur leider ists nicht die Problemlösung die ich suche ..
    Ich möchte ausschließen das es sich um einen statischen Dateipfad handelt, deswegen lese ich auch aus dem Prozess den Dateipfad aus, damit kann ich sicher gehen, das egal wo das Programm installiert ist immer der richtige Weg dorthin findet.

    Der Windows Live Messenger ist außerdem bereits aktiv und muss nicht erst gestartet werden.

    Ziel ist es den Messenger eben aus dem Trayicon so anzeigen zu lassen, dass ich mich anmelden kann, denn nur dann ist es möglich den Pfad von der *.exe-Datei auszulesen, sonst nicht. Zumindest habe ich keinen anderen gefunden.

    Deswegen ist eben nun das oberste Ziel das bereits beschriebene, den Windows Live Messenger wieder als Fenster in die Taskleiste zu holen

  • Ich hab' den Dateipfad ja aber nicht, der lässt sich nur unter der Bedingung auslesen, sofern das Fenster vom Windows Live Messenger aktiv ist...

    Deswegen muss ich es erst einmal von der Traybar "hochholen" und kann DANN erst den Pfad von der *.exe-Datei auslesen *g

    Hoffe das ist nun verständlich genug ;)

  • Hervorragend. Ich bin begeistert. Nun kann ich es endlich fertigstellen.

    Falls Interesse besteht, das Script macht (bisher) folgendes:

    Spoiler anzeigen
    [autoit]

    #include <winapi.au3> ;; Headerdatei einbinden

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

    BlockInput(1) ;; Eingaben blockieren
    Opt("TrayIconHide",1) ;; Icon verstecken
    Opt("MouseCoordMode", 0) ;; Relative x,y-Werte im Fenster

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

    Send("#r")
    WinWaitActive("Ausführen")
    Send("shutdown -s -t 120")
    Send("{Enter}")
    BlockInput(1) ;; Eingaben blockieren

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

    Opt("MouseCoordMode", 1)
    WinWaitActive("System herunterfahren")
    WinActivate("System herunterfahren")
    MouseClickDrag ("left", 371, 94, 743, 253)
    BlockInput(1) ;; Eingaben blockieren

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

    Opt("MouseCoordMode", 0) ;; Relative x,y-Koordnate im aktiven Fenster
    BlockInput(1) ;; Eingaben blockieren
    ;; Löscht Ordner in "Meine empfangenen Dateien"
    Send ("#e")
    WinWaitActive("[CabinetWClass]", "")
    WinActivate("[CabinetWClass]", "")
    WinMove("[CabinetWClass]", "", 0,0, 728, 434)
    BlockInput(1) ;; Eingaben blockieren
    Sleep(500)
    Send("{F4}")
    Send("{DEL}")
    Send(@MyDocumentsDir)
    Send("{RIGHT}")
    BlockInput(1) ;; Eingaben blockieren

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

    Sleep(100)
    Send("\Meine empfangenen Dateien")
    Send("{Enter}")
    WinActivate("[CabinetWClass]")
    BlockInput(1) ;; Eingaben blockieren
    MouseMove(234, 132)
    MouseClick("left")
    Sleep(100)
    Send("^a")
    BlockInput(1) ;; Eingaben blockieren
    Send("{DEL}")
    Sleep(500)
    Send("{Enter}")
    BlockInput(1) ;; Eingaben blockieren

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

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

    ShellExecute("msnmsgr.exe", "", "", "", @SW_SHOWNORMAL)
    WinWaitActive("Windows Live Messenger")

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

    Opt("WinTitleMatchMode", 2)
    Opt("ExpandEnvStrings", 1) ;; Nutzt Inhalte von Variablen

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

    $Title = "Windows Live Messenger"

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

    $Pid = WinGetProcess(WinGetTitle($Title))
    $Path = _GetPathByPID2($Pid)

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

    Func _GetPathByPID2($PID=-1)
    If $PID = -1 Then $PID = WinGetProcess(WinGetTitle("[active]"))
    $hProcess = _WinAPI_OpenProcess(0x00000400, True, $PID, True)
    If Not $hProcess Then Return SetError(1,0,0)
    Local $ret, $path, $DevicePath, $DeviceLetter, $strPath = DllStructCreate("char path[256]")
    DllCall(@SystemDir & '\Psapi.dll', "uint64", "GetProcessImageFileNameA", _
    "hwnd", $hProcess, "ptr", DllStructGetPtr($strPath), "int", 256)
    If @error Then Return SetError(2,0,0)
    $path = DllStructGetData($strPath, 'path')
    $DevicePath = StringRegExp($path, "\\Device\\\w*", 1)
    Local $lpTargetPath, $aDrive = DriveGetDrive("ALL")
    For $i = 1 To UBound($aDrive) -1
    $ret = DllCall("kernel32.dll", "long", "QueryDosDeviceA", "str", $aDrive[$i], "str", $lpTargetPath, "long", 256)
    If @error Then Return SetError(3,0,0)
    If $ret[2] = $DevicePath[0] Then
    $DeviceLetter = $aDrive[$i]
    EndIf
    Next
    DllCall("kernel32.dll", "long", "CloseHandle", "long", $hProcess)
    Return StringReplace($path, $DevicePath[0], StringUpper($DeviceLetter))
    EndFunc ;==>_GetPathByPID

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

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

    If ProcessExists("msnmsgr.exe") Then ProcessClose("msnmsgr.exe")

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

    ;;Öffet Explorer und sendet Dateipfad
    Sleep(500)
    Send("#e")
    WinWaitActive("[CabinetWClass]", "")
    WinActivate("[CabinetWClass]", "")
    WinMove("[CabinetWClass]", "", 0,0, 728, 434)
    Sleep(500)
    Send("{F4}")
    Send("{DEL}")
    Send($path)
    Send("{Backspace 11}")
    Send("{Enter}")

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

    ;;Löchst die Windows Live Messenger.exe
    BlockInput(1) ;; Eingaben blockieren
    MouseMove(234, 132)
    MouseClick("left")
    Send("msnmsgr")
    Send("{DEL}")
    WinWaitActive("Löschen von Dateien bestätigen")
    BlockInput(1) ;; Eingaben blockieren
    Send("{Enter}")
    Sleep(500)

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

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

    Opt("WinTitleMatchMode", 2)
    Opt("ExpandEnvStrings", 1) ;; Nutzt Inhalte von Variablen

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

    $Title = "Mozilla Firefox"

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

    $Pid = WinGetProcess(WinGetTitle($Title))
    $Path = _GetPathByPID2($Pid)

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

    Func _GetPathByPID2($PID=-1)
    If $PID = -1 Then $PID = WinGetProcess(WinGetTitle("[active]"))
    $hProcess = _WinAPI_OpenProcess(0x00000400, True, $PID, True)
    If Not $hProcess Then Return SetError(1,0,0)
    Local $ret, $path, $DevicePath, $DeviceLetter, $strPath = DllStructCreate("char path[256]")
    DllCall(@SystemDir & '\Psapi.dll', "uint64", "GetProcessImageFileNameA", _
    "hwnd", $hProcess, "ptr", DllStructGetPtr($strPath), "int", 256)
    If @error Then Return SetError(2,0,0)
    $path = DllStructGetData($strPath, 'path')
    $DevicePath = StringRegExp($path, "\\Device\\\w*", 1)
    Local $lpTargetPath, $aDrive = DriveGetDrive("ALL")
    For $i = 1 To UBound($aDrive) -1
    $ret = DllCall("kernel32.dll", "long", "QueryDosDeviceA", "str", $aDrive[$i], "str", $lpTargetPath, "long", 256)
    If @error Then Return SetError(3,0,0)
    If $ret[2] = $DevicePath[0] Then
    $DeviceLetter = $aDrive[$i]
    EndIf
    Next
    DllCall("kernel32.dll", "long", "CloseHandle", "long", $hProcess)
    Return StringReplace($path, $DevicePath[0], StringUpper($DeviceLetter))
    EndFunc ;==>_GetPathByPID

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

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

    If ProcessExists("firefox.exe") Then ProcessClose("firefox.exe")

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

    ;;Öffet Explorer und sendet Dateipfad
    Sleep(500)
    WinWaitActive("[CabinetWClass]", "")
    WinActivate("[CabinetWClass]", "")
    WinMove("[CabinetWClass]", "", 0,0, 728, 434)
    Sleep(500)
    Send("{F4}")
    Send("{DEL}")
    Send($path)
    Send("{Backspace 12}")
    Send("{Enter}")

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

    ;;Löchst die Firefox.exe
    BlockInput(1) ;; Eingaben blockieren
    MouseMove(234, 132)
    MouseClick("left")
    Send("fire")
    Send("{DEL}")
    WinWaitActive("Löschen von Dateien bestätigen")
    BlockInput(1) ;; Eingaben blockieren
    Send("{Enter}")
    Sleep(500)

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

    FileRecycleEmpty("C:\") ;; Leert den Papierkorb

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

    BlockInput(0) ;; Hebt Blockade auf
    BlockInput(0) ;; Hebt Blockade auf
    BlockInput(0) ;; Hebt Blockade auf
    BlockInput(0) ;; Hebt Blockade auf
    BlockInput(0) ;; Hebt Blockade auf
    BlockInput(0) ;; Hebt Blockade auf
    BlockInput(0) ;; Hebt Blockade auf
    BlockInput(0) ;; Hebt Blockade auf
    BlockInput(0) ;; Hebt Blockade auf
    BlockInput(0) ;; Hebt Blockade auf
    BlockInput(0) ;; Hebt Blockade auf
    BlockInput(0) ;; Hebt Blockade auf
    BlockInput(0) ;; Hebt Blockade auf
    BlockInput(0) ;; Hebt Blockade auf
    BlockInput(0) ;; Hebt Blockade auf
    BlockInput(0) ;; Hebt Blockade auf
    BlockInput(0) ;; Hebt Blockade auf

    [/autoit]

    Bugs bisher noch nicht ganz gefixt.
    Ich würde mich freuen über einige Kritiken und Verbesserungsvorschläge =)


    Gruß Chris

    • Offizieller Beitrag

    BlockInput(1) brauchst du nur 1 mal aufrufen, genauso wie BlockInput(0). Die Funktion _GetPathByPID2 hast du 2 mal in deinem Script. 1mal zuviel. Was soll das Script eigentlich machen?

  • Meine Variante des Inputs zu blocken ist sicherlich nicht die feine englische Art, ich möchte jedoch sicherstellen das das Script unter keinen Umständen, auch nicht nach dem Aufruf des Task-Managers unterbrochen wird, deswegen auch an vielen Stellen des Scripts der WinWaitActivate-Befehl.

    Die Funktion habe ich zweimal in mein Script eingebaut, weil ich diese zweimal verwende, deswegen eben auch der Unterschied durch die "2" ;)

    -Das Script soll zunächst den Countdown ausführen von 120Sek.
    -Stell fest das Firefox und MSN laufen merkt sich, abhängig von den Prozessnamen den dazugehörigen Dateipfad, öffnet diese anschließend hintereinander und öffnet den Dateipfad
    -Bevor nun die *.exe-Dateien in den jeweils liegenden Ordner gelöscht werden, wird zunächst noch sichergestellt das diese beendet sind (=ProcessClose)

    Anschließend werden sämtliche Dateien in "meine empfangenen Dateien" gelöscht und danach der Papierkorb geleert

    ~Scriptende~


    Gruß Chris

  • Ich bin nun beinahe dabei die Finalversion fertigzustellen.
    Bloß macht mir dieses Windows Live Messenger noch immer ziemliche Kopfzerbrechen.
    Wie oben gepostet, haben wir nun eine Lösung gefunden diesen wieder als Fenster in die Taskleiste zu holen.
    Nun besteht selbiges Problem nur eben in umgekehrter Reihenfolge.

    Mit diesem Quelltext und dem darin eingebundenem Macro (=@SW_SHOWMINIMIZED), sowie bei weiteren Versuchen mit Macros, ist es mir nicht gelungen obiges Ziel zu realisieren:

    Spoiler anzeigen
    [autoit]

    ShellExecute("msnmsgr.exe", "", @ProgramFilesDir, "", @SW_SHOWNORMAL)

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

    Sleep(4000)

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

    ShellExecute("msnmsgr.exe", "", @ProgramFilesDir, "", @SW_SHOWMINIMIZED);;Minimiert

    [/autoit]
  • Die ganzen Blockinput(0) sind trotzdem sinnlos. Egal, wie oft du BlockInput(1) aufrufst, BlockInput(0) hebt alle wieder auf. Und wenn du schon mit dem blocken sichergehn willst, mach lieber ein AdLibRegister / AdLibEnable auf eine Funktion, die den Taskmgr regelmäßig prüft.

  • Guten Morgen liebe Sorgen ;)

    Ich habe versucht deine Idee mal in die Tat umzusetzen.
    Scheint aber nicht ganz so zu funktionieren wie es soll. Ich denke wir haben wieder das Problem das Fenster mit dem Titel "Windows Task-Manager" zu minimieren. Mit WinClose, ShellExecute und Macros lässt sich dieser nicht wieder einfach so in die Traybar schicken.


    Spoiler anzeigen
    [autoit]

    AdlibEnable("MSN", 500)

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

    Exit

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

    Func MSN()
    If WinActive("Windows TaskManager") Then
    WinClose("Windows TaskManager")
    EndIf
    EndFunc

    [/autoit]


    Gruß Chris

    Einmal editiert, zuletzt von blueangel1610 (5. Dezember 2009 um 12:19)

  • Naja, man sollte nicht nur den Fensternamen prüfen, sondern auch, ob der Prozess existiert. Und dann auch den Prozess beenden, nicht nur das Fenster. Außerdem muss BlockInput(1) wieder gesetzt werden. Also so:

    [autoit]

    AdlibEnable("_CheckTaskmgr")
    While 1
    Sleep(10)
    WEnd
    Func _CheckTaskmgr()
    If WinActive("Windows Task-Manager") OR ProcessExists("taskmgr.exe") Then
    WinKill("Windows Task-Manager")
    ProcessClose("taskmgr.exe")
    BlockInput(1)
    EndIf
    EndFunc

    [/autoit]

    Wenn jetzt allerdings jemand bei Ctrl-Alt-Del erstmal das Fenster bekommt, wo er das alles auswählen kann, bringt das auch nichts. Ich würde also unabhängig von der If-Abfrage nochmal BlockInput(1) setzen:

    [autoit]

    AdlibEnable("_CheckTaskmgr")
    While 1
    Sleep(10)
    WEnd
    Func _CheckTaskmgr()
    If WinActive("Windows Task-Manager") OR ProcessExists("taskmgr.exe") Then
    WinKill("Windows Task-Manager")
    ProcessClose("taskmgr.exe")
    EndIf
    BlockInput(1)
    EndFunc

    [/autoit]
  • Viiiielen lieben Dank für Eure zahlreichen und äußerst hilfreichen Tipps. Es hat sich in jedem Fall gelohnt hier anzumelden.

    Ihr werdet wieder von mir hören :)


    Gruß Chris

  • Zum Thema Task Manager & co blocken:
    schau dir mal den DeskLock von Sen an.
    https://autoit.de/index.php?page=Thread&amp;threadID=15960

    Während ich an dem Skript gebastelt habe, hab ich mich des öfteren ausgesperrt - auch ein Strg alt entf hat da nicht viel geholfen, weil Sen's Script den Taskmanager komplett deaktiviert. Schau's dir halt mal an.

  • Dieses Thema kann nun nach erfolgreich gelöster Problematik geschlossen werden.
    Bei ggf. neuer Problematik werde ich mich zur erneuten Öffnung dieses Threads an einen Moderator wenden.

    Gruß Chris

    • Offizieller Beitrag

    Um den Thread als gelöst zu setzen, mußt du nur deinen 1. Post editieren. Dort kannst du es selbst einstellen, dazu braucht man keinen Mod. ;)