Hilf bei Script zum Abfangen von Win+D

  • Hallo Leute, nach mehrtägigem Kampf muss ich sagen dass ich als Neuling gescheitert bin.

    Ich schaffe es einfach nicht.


    Und zwar bräuchte ich folgendes:

    Nur wenn der User die Windows+D oder das Show Desktop Icon drückt möchte ich dass ein Fenster mit der Klasse Sticky_Notes_Note_Window restored wird.

    Ich check das mit den Is_Pressed Funktionen nicht wie man da Windows+D bzw. Show Desktop hineinbekommt

    Folgendes habe ich versucht.

    Kann mir wer helfen und das mit den Hotkeys erkären. Auch wie man den Button unten rechts im Windows7 Show Desktop abfragen kann.

    Vielen lieben Dank

    While 1
    For $i = 1 To 100
    If _IsPressed({Win+D}) Then
    WinSetState("[CLASS:Sticky_Notes_Note_Window]", "", @SW_RESTORE)

    EndIf
    Next
    Sleep(100)
    WEnd

  • Was Hotkeys angeht, ist das in der Hilfe gut beschrieben: http://translation.autoit.de/onlinehilfe/fu…s/HotKeySet.htm
    Ich muss dich aber enttäuschen: Win+D ist von Windows reserviert.

    Statt des Hotkeys kannst du es so versuchen:

    [autoit]

    #include <Misc.au3>

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

    Local $hDLL = DllOpen("user32.dll")

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

    While 1
    If _IsPressed("44", $hDLL) And (_IsPressed("5B", $hDLL) Or _IsPressed("5C", $hDLL)) Then ; Wenn Win+D gedrückt wurde
    WinSetState("[CLASS:Sticky_Notes_Note_Window]", "", @SW_RESTORE)
    While _IsPressed("44", $hDLL) And (_IsPressed("5B", $hDLL) Or _IsPressed("5C", $hDLL)); Warten solange Win+D gedrückt ist
    sleep(10)
    WEnd
    EndIf
    Sleep(10)
    WEnd

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

    DllClose($hDLL)

    [/autoit]


    Was das Blockieren des Buttons angeht muss ich passen.

  • Hi,

    Zitat

    Auch wie man den Button unten rechts im Windows7 Show Desktop abfragen kann.

    Genau wie man sämtliche anderen Buttons und Controls auch "abfragt".
    Schau mal in deinem AutoIt-Verzeichnis nach dem AutoIt Window Info Tool.

  • Hallo erst mal vielen Dank für die prompte Antwort.

    Leider geht das ganze nicht unter Windows 2008 R2 auf Citrix, mit RDP geht es.
    Bräuchte es unter Windows 2008 R2 XENAPP.


    Keine Ahnung warum das Verhalten anders ist.


    Das mit dem Button habe ich hinbekommen.

    Geht aber auch nicht unter Citrix:

    Spoiler anzeigen


    #include <Array.au3>
    #include <Misc.au3>
    #include <WinAPI.au3>

    ;If @OSVersion <> "WIN_7" Then Exit MsgBox(16, "Error", "Code is running only on Win7", 15)

    Global $__Data, $i, $ID, $x1, $x2, $y1, $y2

    Global Const $dll = DllOpen("user32.dll")
    Global Const $hWnd = WinGetHandle("[CLASS:Shell_TrayWnd]")
    Global $aPos = WinGetPos($hWnd)

    Global $aData = _WinAPI_EnumChildWindows($hWnd)
    For $i = 1 To UBound($aData) - 1
    If $aData[$i][1] = "TrayShowDesktopButtonWClass" Then
    $aResult = DllCall($dll, "Int", "GetDlgCtrlID", "HWND", $aData[$i][0])
    $ID = $aResult[0]
    ExitLoop
    EndIf
    Next
    $aCtrlPos = ControlGetPos($hWnd, "", $ID)

    $x1 = $aCtrlPos[0]
    $y1 = $aPos[1]
    $x2 = $aCtrlPos[0] + $aCtrlPos[2]
    $y2 = $aPos[2]

    HotKeySet("{ESC}", "_Exit")

    While Sleep(100)
    If _IsPressed("01", $dll) Then
    $aM = MouseGetPos()
    If $aM[0] > $x1 And $aM[0] < $x2 And $aM[1] > $y1 And $aM[1] < $y2 Then
    MsgBox(0, "Test", "Tray Show Desktop Button was clicked!")
    ;WinSetState("[CLASS:Sticky_Notes_Note_Window]", "", @SW_RESTORE)
    ;WinActivate("[CLASS:Sticky_Notes_Note_Window]", "")
    EndIf
    EndIf
    WEnd

    Func _Exit()
    DllClose($dll)
    Exit
    EndFunc

    Func _WinAPI_EnumChildWindows($hWnd, $fVisible = 1)
    If Not _WinAPI_GetWindow($hWnd, 5) Then SetError(1, 0, 0)
    Local $hEnumProc = DllCallbackRegister('__EnumWindowsProc','int','hwnd;lparam')
    Local $Error = 1

    Dim $__Data[101][2] = [[0]]
    DllCall('user32.dll', 'int', 'EnumChildWindows', 'hwnd', $hWnd, 'ptr', DllCallbackGetPtr($hEnumProc), 'lparam', $fVisible)
    If @error Then
    $__Data = 0
    Else
    $Error = 0
    If $__Data[0][0] Then
    ReDim $__Data[$__Data[0][0] + 1][2]
    Else
    $__Data = 0
    EndIf
    EndIf
    DllCallbackFree($hEnumProc)
    Return SetError($Error, 0, $__Data)
    EndFunc ;==>_WinAPI_EnumChildWindows

    Func __EnumWindowsProc($hWnd, $fVisible)
    If ($fVisible) And (Not _WinAPI_IsWindowVisible($hWnd)) Then Return 1
    $__Data[0][0] += 1
    If $__Data[0][0] > UBound($__Data) - 1 Then
    ReDim $__Data[$__Data[0][0] + 100][2]
    EndIf
    $__Data[$__Data[0][0]][0] = $hWnd
    $__Data[$__Data[0][0]][1] = _WinAPI_GetClassName($hWnd)
    Return 1
    EndFunc ;==>__EnumWindowsProc


    Lg und danke nochmals

    4 Mal editiert, zuletzt von kuchi (10. Januar 2014 um 14:53)