Winmove keine Reaktion

  • Hallo,

    keine Ahnung woran es liegen kann.
    Bekomme Winmove nicht zum laufen.

    Es sollte die Fenstergröße fest eingstellt werden

    [autoit]


    ShellExecute(@WindowsDir&"\system32\osk.exe")
    Sleep(2000)

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

    Msgbox(0,"","Die Größe wird nun geändert")

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

    ;WinMove("[CLASS:OSKMainClass]", "", Default, Default, 1000, 500)
    WinMove("Bildschirmtastatur", "", Default, Default, 1000, 500)

    [/autoit]

    ;) Grüße Ilse

  • Funktioniert hier einwandfrei, wäre aber nett gewesen zu erwähnen, dass die Fenstergröße nicht mehr manuell verändert werden kann und man somit dauerhaft dieses riesen Fenster ertragen muss und raten kann wie groß es eigentlich sein sollte...

  • Hallo Misterspeed,

    hm... bei mir tut sich absolut nichts!
    Win7 64 bit...

    Zitat


    wäre aber nett gewesen zu erwähnen....


    tut mir leid Misterspeed hätte ich natürlich gemacht, aber
    wie gesagt, da tut sich nichts.

    Wollte nur eine bestimmte Größe des Fensters einstellen,
    und das geht bei mir leider nicht!
    Weiß jemand warum?

    :( Ilse

  • Hallo,

    ich habe grad auch mal versucht osk mit WinMove() zu verschieben. Bei mir tut sich da aber ebenfalls nichts.
    Hat mittlerweile zufällig jemand heausgefunden woran das liegen könnte?
    Da es ja bei einigen Leuten funktioniert, könnte ich mir vorstellen, dass es irgendeine Win7 Einstellung ist...

    Grüße,
    notna

  • Also bei mir klappts auch nicht... :(

    Bei mir kommt zuerst "Die Bildschirmtastatur konnte nicht gestartet werden."
    Wenn ich das dann von Hand mache (und ShellExecute entferne), wird die Position nicht verändert...

    PS: Ich habe auch Windows 7 (64 Bit)

  • Ich zitiere einfachmal SEuBo aus einem anderen Thread bezüglich OSK.exe. Das Script muss als 64bit ausgeführt werden oder es muss eben fallabhängig die Ordnerumleitung deaktiviert werden, damit die osk.exe ohne Fehler startet. Die Größenänderung funktioniert bei mir nachwievor unter zwei verschiedenen Windows 7 64bit Systemen, genau wie damals unter Vista.

    Wenn es bei euch nicht funktionieren sollte würde ich mal mit au3windowinfo prüfen ob euer Fenstertitel "Bildschirmtastatur" lautet oder ob ihr evtl. mit einer anderen Sprachversion arbeitet. Wenn ihr eine gecrackte Windowsversion habt würde es mich auch nicht wundern, wenn eine der genutzten Systemdateien nicht dem Original entspricht, denn die osk.exe bzw. utilman.exe (und noch einige weitere...) kann genutzt werden um sich eine Backdoor auf den Anmeldebildschirm zu zaubern.

    Meine osk-Version: 6.1.7600.16385 631KB 14.07.2009
    Win Version: Windows 7 Professional 64bit inkl. SP1 und allen Updates


    Wird meine Antwort hier bewusst ignoriert?! Ich WEIß nämlich zufällig, dass die Lösung funktioniert...

    Hier nochmal für die ganz faulen...

    [autoit]

    Local $iState
    If @CPUArch = "X64" And Not @AutoItX64 Then
    DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "ptr", $iState)
    EndIf

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

    ShellExecute("osk")

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

    If @CPUArch = "X64" And Not @AutoItX64 Then
    DllCall("kernel32.dll", "int", "Wow64RevertWow64FsRedirection", "dword", $iState)
    EndIf

    [/autoit]
  • Hi,

    das Starten funktioniert bei mir. Lediglich WinMove() haut nicht hin.
    Habe eine legale Win7 prof. 64 Bit inkl. SP1 und allen Updates (MSDNAA).
    Das Window Info tool zeigt:

    >>>> Window <<<<
    Title: Bildschirmtastatur
    Class: OSKMainClass

    Habe grad mal die Notlösung über WinGetPos() und MouseClickDrag() versucht.. Funktioniert mit der Bildschirmtastatur merkwürdigerweise auch nicht. Mit der Maus kann ich sie jedoch belibig verschieben und skalieren.

    Grüße,
    notna

  • Hast du auch eine ausreichend dimensionierte Pause zwischen Start der osk.exe und winmove eingebaut? Das Fenster muss natürlich existieren bevor es verschoben werden kann. Das kannst du entweder über ein ausreichend langes sleep (siehe testscript von ilse) realisieren oder was eigentlich besser wäre mit einer Schleife die auf die Existenz des Fensters wartet:

    [autoit]


    shellexecute(...)
    do
    sleep(100)
    until winexists("Bildschirmtastatur")
    consolewrite("fenster sollte existieren" & @crlf)
    winmove(...)

    [/autoit]
  • Das Fenster existiert. Habe osk auch schon manuell gestartet und dann lediglich WinMove aus ScITE abgefeuert...

  • Dann mach mal folgendes:

    1. osk von Hand starten
    2. Au3Info verwenden um alle Details des Fensters zu bekommen, also auch das Handle (kopier dir die infos vom tab summary und beende au3info)
    3. nun starte das Testscript (siehe unten)
    4. wurden Fenster mit dem Titel gefunden?
    5. vergleiche die Konsolen Rückgabe von winmove mit dem vorher ausgelesenen Window handle, außerdem nochmals prüfen ob du den korrekten Fenstertitel angegeben hast (verschrieben?)
    6. Wenn winmove 0 zurückgibt liegt definitiv ein Problem mit der winmove Funktion vor.

    Die Rückgabe in der Scite Console sollte so ausschaun:

    Code
    Folgende Fenster wurden gefunden:
    Fenster 1: Bildschirmtastatur / 0x000000000003082E
    Rückgabe von winmove (handle des fensters): 0x000000000003082E
    [autoit]


    getAllWindows("Bildschirmtastatur")
    $test = WinMove("Bildschirmtastatur", "", Default, Default, 1000, 700)
    ConsoleWrite("Rückgabe von winmove (handle des fensters): " & $test & @CRLF)

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

    #cs
    >>>> Window <<<<
    Title: Bildschirmtastatur <--- (verschrieben?)
    Class: OSKMainClass
    Position: 318, 126
    Size: 801, 231
    Style: 0x16CE0000
    ExStyle: 0x08040108
    Handle: 0x000000000003082E <--- muss mit Rückgabe von winmove übereinstimmen
    #ce

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

    func getAllWindows($titel)
    $aTest = WinList($titel)
    If $aTest[0][0] = 0 Then
    ConsoleWrite('FEHLER: keine Fenster mit dem Titel "' & $titel & '" gefunden !' & @CRLF)
    Else
    ConsoleWrite("Folgende Fenster wurden gefunden:" & @CRLF)
    For $i = 1 to $aTest[0][0]
    ConsoleWrite("Fenster " & $i & ": " & $aTest[$i][0] & " / " & $aTest[$i][1] & @CRLF)
    Next
    EndIf
    EndFunc

    [/autoit]

    Neben einem fehlerhaften Titel beim winmove Aufruf könnte ggf. eine Antivirenlösung Spielereien mit Systemfenstern unterbinden (eher unwahrscheinlich). Testweise mal deaktivieren.
    Evtl ist auch deine Autoit Version verbuggt. Ich verwende noch Version 3.3.6.1

    EDIT:

    Winmove funktioniert btw nur bei Fenstern die nicht minimiert sind.

    6 Mal editiert, zuletzt von misterspeed (27. April 2013 um 13:57)

  • Danke für die detaillierte Antwort!
    Handles stimmen in Window Info und WinMove Rückgabe überein. Sämtliche Antiviren-Programme sind ebenfalls deaktiviert... Verwende übrigens Autoit v3.3.8.1.
    Sowohl auf meinem Laptop als auch in einer VM passiert einfach nichts, sind aber auch die selben Win7 Versionen.
    Minimiert ist osk auch nicht ;)

  • Halte es zwar für unwahrscheinlich, dass es daran liegt, aber hast du UAC (Benutzerkontensteuerung) aktiviert und/oder arbeitest du mit Benutzerrechten? Wenn ja testweise mal deaktivieren (reboot nicht vergessen) und nochmal als Administrator testen. Wahrscheinlicher dürfte aber ein Problem mit der aktuellen Autoit Version sein, daher würde ich mal eine ältere Autoit Version testen.

  • Verdammt! Es liegt an der UAC... Wenn man diese deaktiviert läufts ohne Probleme. #RequireAdmin funzt auch, allerdings nur mit UAC PopUp. Ärgerlich. Bin mir nicht sicher, ob ich UAC auf dem Rechner in der Uni, für den das ganze gedacht ist deaktivieren darf. Evtl. muss ich mich mal nach einer alternativen Bildschirmtastatur umsehen.

    Trotzdem großen Dank an misterspeed für die Mühe und natürlich auch die Lösung!!

    Grüße,
    notna

  • Nunja vielleicht reicht es auch die Sicherheitsstufe von UAC zu senken. Alternativ gäbe es auch noch diverse Möglichkeiten die UAC Abfrage für bestimmte Anwendungen auszuhebeln. Google sollte da denke ich sogar zwei verschiedene Ansätze liefern. Die eine Funktioniert über die Aufgabenplanung und eine spezielle Verknüpfung, die andere denke ich über das Application Compatibility Toolkit. Beides muss mit einem Administrator Account einmalig eingerichtet werden. Das Problem wird vermutlich sein, dass die Bildschirmtastatur teilweise mit Systemprivilegien ausgeführt wird (deswegen funktioniert übrigens auch die genannte Backdoor Sache...) und UAC deswegen allen Anwendungen mit niederen Rechten diverse Dinge wie winmove() verbietet. Vermutlich will Microsoft so verhindern, dass man System Fenster manipuliert und einen User dazu verleitet "genau die richtige" Antwort anzuklicken.

  • Stimmt. Das mit der Aufgabenplanung und einer Verknüfung habe ich auch mal für eine Geschichte mit devcon benutzt. Werde mir das Application Compatibility Toolkit mal ansehen.