Desktop Switcher

  • Hallo!

    Ich bin gerade dabei einen Desktop-Switcher aufzubauen, doch leider will er nicht, wie ich will :(

    Was mache ich falsch ?(

    Source-Code

    #include <Array.au3>
    #include <Constants.au3>
    #include <windowsConstants.au3>

    Global $Windows_Desktop[4][1000], $aWindows[1][1], $hUser32 = DllOpen('user32.dll'), $iEx_Style, $iCounter = 0
    $aWindows = _ReadWindows()
    For $i = 0 To UBound($aWindows, 2) - 1
    $Windows_Desktop[0][$i] = $aWindows[$i][0]
    Next

    HotKeySet("^1", "_1")
    HotKeySet("^2", "_2")
    HotKeySet("^3", "_3")
    HotKeySet("^4", "_4")

    Func _1()
    _switch(1)
    EndFunc ;==>_1

    Func _2()
    _switch(2)
    EndFunc ;==>_2

    Func _3()
    _switch(3)
    EndFunc ;==>_3

    Func _4()
    _switch(4)
    EndFunc ;==>_4


    Func _ReadWindows()
    Local $aWin = WinList()

    For $i = 1 To $aWin[0][0]
    $iEx_Style = BitAND(GetWindowLong($aWin[$i][1], $GWL_EXSTYLE), $WS_EX_TOOLWINDOW)
    Local $iStyle = BitAND(WinGetState($aWin[$i][1]), 2)

    If $iEx_Style <> -1 And Not $iEx_Style And $iStyle Then
    ReDim $aWindows[$iCounter + 1][1]
    $aWindows[$iCounter][0] = $aWin[$i][0]
    $iCounter += 1
    EndIf
    Next

    Return $aWindows
    EndFunc ;==>_ReadWindows

    Func GetWindowLong($hWnd, $iIndex, $hUser = 'user32.dll')
    Local $Ret = DllCall($hUser, 'int', 'GetWindowLong', 'hwnd', $hWnd, 'int', $iIndex)
    If Not @error Then Return $Ret[0]
    Return SetError(-1, 0, -1)
    EndFunc ;==>GetWindowLong

    Func OnAutoItExitFunc()
    DllClose($hUser32)
    EndFunc ;==>OnAutoItExitFunc

    Func _switch($Desktop)
    $aWindows = _ReadWindows()
    For $i = 0 To UBound($aWindows, 2) - 1
    $Windows_Desktop[$Desktop - 1][$i] = $aWindows[$i][0]
    Next

    For $i = 0 To 3
    For $j = 0 To UBound($Windows_Desktop, 2)
    If $Desktop - 1 <> $i Then
    WinSetState($Windows_Desktop[$i][$j], "", @SW_HIDE)
    Else
    WinSetState($Windows_Desktop[$i][$j], "", @SW_SHOW)
    EndIf
    Next
    Next

    ToolTip("Desktop " & $Desktop)
    EndFunc ;==>_switch

    While 1
    Sleep(100)
    WEnd

    Die Fenster werden unkontrolliert ein und ausgeblendet und der Tool-Tip wird nicht angezeigt...

    Einmal editiert, zuletzt von MatthiasG. (24. März 2009 um 14:48)

  • tut mir leid, aber ich kann dein script micht nachvollziehen. villeicht hift es ja, alles mal zu kommentieren und dann nochmal nach fehlern zu suchen

    Canyon

  • Ich hab da was für dich :D:

    Spoiler anzeigen
    [autoit]

    Send("!{TAB}")

    [/autoit]

    Hmm ne tut mir leid ich hab auch kein Plan wo der Fehler steckt...

  • Also, nochmal mein Code kommentiert ;) :

    &quot;Source-Code&quot;
    [autoit]

    #include <Array.au3>
    #include <Constants.au3>
    #include <windowsConstants.au3>

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

    Global $Windows_Desktop[4][1000], $aWindows[1][1], $hUser32 = DllOpen('user32.dll'), $iEx_Style, $iCounter = 0
    $aWindows = _ReadWindows() ; Die aktuell angezeigetn Fenster werden eingelesen
    For $i = 0 To UBound($aWindows, 2) - 1 ; Die Fenster werden dem erstem Desktop zugewiesen.
    $Windows_Desktop[0][$i] = $aWindows[$i][0]
    Next

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

    HotKeySet("^1", "_1") ;Die Hotkeys werden definiert, _switch(x) wechselt auf den betreffenden Desktop
    HotKeySet("^2", "_2")
    HotKeySet("^3", "_3")
    HotKeySet("^4", "_4")

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

    Func _1()
    _switch(1)
    EndFunc ;==>_1

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

    Func _2()
    _switch(2)
    EndFunc ;==>_2

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

    Func _3()
    _switch(3)
    EndFunc ;==>_3

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

    Func _4()
    _switch(4)
    EndFunc ;==>_4

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

    Func _ReadWindows() ; hier werden alle offenen Fenster gezeigt.
    Local $aWin = WinList()

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

    For $i = 1 To $aWin[0][0]
    $iEx_Style = BitAND(GetWindowLong($aWin[$i][1], $GWL_EXSTYLE), $WS_EX_TOOLWINDOW)
    Local $iStyle = BitAND(WinGetState($aWin[$i][1]), 2)

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

    If $iEx_Style <> -1 And Not $iEx_Style And $iStyle Then
    ReDim $aWindows[$iCounter + 1][1]
    $aWindows[$iCounter][0] = $aWin[$i][0]
    $iCounter += 1
    EndIf
    Next

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

    Return $aWindows
    EndFunc ;==>_ReadWindows

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

    Func GetWindowLong($hWnd, $iIndex, $hUser = 'user32.dll')
    Local $Ret = DllCall($hUser, 'int', 'GetWindowLong', 'hwnd', $hWnd, 'int', $iIndex)
    If Not @error Then Return $Ret[0]
    Return SetError(-1, 0, -1)
    EndFunc ;==>GetWindowLong

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

    Func OnAutoItExitFunc() ;beim Beenden die DLL schließen
    DllClose($hUser32)
    EndFunc ;==>OnAutoItExitFunc

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

    Func _switch($Desktop)
    $aWindows = _ReadWindows() ; zuerst die offenen Fenster registrieren
    For $i = 0 To UBound($aWindows, 2) - 1
    $Windows_Desktop[$Desktop - 1][$i] = $aWindows[$i][0]
    Next

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

    For $i = 0 To 3
    For $j = 0 To UBound($Windows_Desktop, 2); Die Fenster verstecken, die vom neuem anzeigen.
    If $Desktop - 1 <> $i Then
    WinSetState($Windows_Desktop[$i][$j], "", @SW_HIDE)
    Else
    WinSetState($Windows_Desktop[$i][$j], "", @SW_SHOW)
    EndIf
    Next
    Next

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

    ToolTip("Desktop " & $Desktop)
    EndFunc ;==>_switch

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

    While 1
    Sleep(100)
    WEnd

    [/autoit]
  • Danke für deine Antwort!

    Nur leider stehe ich etwas auf dem Schlauch...
    Meinst du den Befehl CreateDesktopEx?

    • Offizieller Beitrag

    Hi,
    deine Problemstellung ist irreführend. Du möchtest einen "Desktop"-Switcher, verwaltest tatsächlich aber nur Fenster. Das ist ein gravierender Unterschied. Desktop ist die Windows-Oberfläche, die Eingaben entgegennimmt, Fenster darstellt und der laufende Prozesse zugeordnet sind. Standardmäßig hat Windows 3 Desktops: Logon, Screensaver und Default - der "Arbeitsdesktop".
    Ich hab noch nie probiert, ob man einen weiteren default-Desktop erstellen kann. Da es bisher nicht im Funktionsumfang enthalten ist, denke ich mal, dass Windows mit der gleichzeitigen Verwaltung mehrerer default-Desktops Probleme haben könnte, bzw. dass dieses wohl nur sehr aufwändig realisierbar ist. ( Mal wieder ein deutlicher Unterschied zu Linux - da sind mehrere Desktops völlig normal :D ).

  • BugFix

    ja das ist möglich ^^ guck mein bildchen an =) hab des bei mir zuhause und auf der arbeit installiert, funzt super :D
    falls dus au willst einfach sagen *g*
    ich glaub aber nicht das des mit autoit möglich ist

    mfg

  • Also erstmal danke für die Antworten!

    Ja, um ehrlich zu sein handelt es sich mehr um einen Fenster-Verwalter, kann man aber gut als Desktop-Switcher "verkaufen" ;)

    @K1773R: Das Programm interessiert mich sehr! Hatte Cube-Desktop, dass kostet aber einiges als Test-Version und Yod3D usw. erfüllt nicht meine Wünsche :D

    Danke auf jedem Fall!

  • hast ne pn ^^

    EDIT 1:

    mit autoit wär das vielleicht möglich aber das wäre soviel arbeit da arbeitest mal n paar monate und es wär lahm wie sau ^^ xD