Fremdes Fenster verschieben unter Win7

Für allgemeine Fragen zur Programmierung mit PureBasic.
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Fremdes Fenster verschieben unter Win7

Beitrag von Sven »

Ich habe ein Programm, welches unter WinXP wunderbar funktionierte, um ein Fenster beliebiger Größe auf einen anderen Desktop (realen Bildschirm) zu verschieben. Der Ablauf ist: Klicken auf das Fenster, klicken auf das Taskleistensymbol, im erscheinenden Menu den Bildschirm auswählen. Das Fenster wird in seiner vorherigen Position und Größe auf dem anderen Bildschirm dargestellt.

Unter Win7 funktioniert die unter WinXP mit 32-bit erstellte Exe bedingt: Das Fenster wird verschoben, erscheint aber an der Pos 0,0 auf dem anderen Bildschirm.

Führe ich den Code in PB unter Win7 aus, passiert gar nichts. Der Debug des Windows-Handles zeigt anscheinend, daß zwischendurch das aktive Fenster wechselt, und zwar wenn ich auf die Taskleiste klicke. Win7 behandelt anscheinend die Taskleiste als Fenster.

Nur: Warum funktioniert dann das unter WinXP erstellte Programm?

Und wie bekomme ich raus, ob der Handle ein "echtes" verschiebbares Fenster oder die Taskleiste ist?

Und schließe ich provisorisch die Taskleiste aus, wird trotzdem nichts verschoben? Funktioniert MoveWindow_() unter Win7 nicht mehr?

Code: Alles auswählen

wIDmain.i = OpenWindow(#PB_Any, 0, 0, 200, 100, "Desktop-Switcher", #PB_Window_SystemMenu | #PB_Window_Invisible)

If IsWindow(wIDmain)
  iIDds.i = CatchImage(#PB_Any, ?logo)
  sIDds.i = AddSysTrayIcon(#PB_Any, WindowID(wIDmain), ImageID(iIDds))
  SysTrayIconToolTip(sIDds, "Desktop-Switcher")

  exit.l = #False

  Repeat
    event.l = WaitWindowEvent(200)
    If event = #PB_Event_SysTray
      hlast.i = hfore.i  ;letztes Vordergrund-Fenster merken
      dcnt.l = ExamineDesktops()
      mIDds.i = CreatePopupMenu(#PB_Any)
      If IsMenu(mIDds)
        For i.l = 1 To dcnt
          MenuItem(i - 1, "- " + Str(i) + " -")
        Next
        MenuBar()
        mIDend.l = dcnt
        MenuItem(mIDend, "Beenden")
      EndIf
      DisplayPopupMenu(mIDds, WindowID(wIDmain))  
    ElseIf event = #PB_Event_Menu
      evID.i = EventMenu()
      If evID = mIDend
        exit = #True
      Else
        dcnt.l = ExamineDesktops()
        desk.l = evID
        If desk >= 0 And desk < dcnt
          If IsWindow_(hlast)
            hrect.RECT
            If IsZoomed_(hlast)  ;maximiert
              ShowWindow_(hlast, #SW_RESTORE)  ;Fenster normal
              MoveWindow_(hlast, DesktopX(desk), DesktopY(desk), DesktopWidth(desk), DesktopHeight(desk), 1)
              ShowWindow_(hlast, #SW_MAXIMIZE)  ;Fenster maximieren
            Else
              GetWindowRect_(hlast, hrect.RECT)
              hwdt = hrect\right - hrect\left
              hhgh = hrect\bottom - hrect\top
              MoveWindow_(hlast, DesktopX(desk), DesktopY(desk), hwdt, hhgh, 1)
            EndIf
          EndIf
        EndIf
      EndIf
    ElseIf event = 0  ;kein Event, Timeout
      hfore = GetForegroundWindow_()  ;aktuelles Vordergrund-Fenster merken 
      Debug hfore
    EndIf
  Until exit
EndIf

DataSection
  logo:
  IncludeBinary "ds.ico"
EndDataSection
Sorry, für die Include bitte ein beliebiges Icon angeben.
Benutzeravatar
Bisonte
Beiträge: 2474
Registriert: 01.04.2007 20:18

Re: Fremdes Fenster verschieben unter Win7

Beitrag von Bisonte »

Ich würde als erstes versuchen, das Handle des Systemtrays/Taskleiste herauszubekommen, damit ich dann vergleichen könnte, ob es sich bei
dem ermittelten Fenster um ein "richtiges" Fenster handelt.

Ausserdem gibt es bei RSBasics API Sammlung ein interessantes Stück Code dazu : http://www.rsbasic.de/aktualisierung/wi ... mitteln.pb

Das könnte evt. weiterhelfen...

P.S. : Die Taskleiste/Systray Fenster hat keinen Anzeigennamen .... ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten