Fremdes Fenster always on top

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.
Benutzeravatar
redacid
Beiträge: 581
Registriert: 29.08.2004 17:06

Fremdes Fenster always on top

Beitrag von redacid »

Hallo,

ein Freund fragte mich neulich, ob es möglich sei, irgendein Fenster (z.B. ein bestimmtes Browserfenster oder nur den Taschenrechner o.ä.) immer im Vordergrund zu behalten. Um es etwas deutlicherr zu erklären: er möchte z.B., dass der Taschenrechner immer im Vordergrund in einer Ecke zu sehen ist, damit er bei Bedarf schneller dahin wechseln kann.


Mir ist keine Möglichkeit bekannt, aber vielleicht kennt ja jemand eine.
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag von Leo »

Ich hab da mal vor langer Zeit was geschrieben, vielleicht könnt ihr ja was damit anfangen:

Code: Alles auswählen

;/
;/WindowsXP Topper
;/Sucht nach allen verfügbaren Fenstern, und bietet die Möglichkeit, sie zu toppen!
;/(C) 2005 by Leo (http://www.leoxikon.de)
;/

Enumeration ;Windows
    #Window_Main
EndEnumeration
Enumeration ;Gadgets
    #Gadget_ComboBox_Windows
    #Gadget_Text_Info
    #Gadget_CheckBox_Forerground
    #Gadget_Button_Reload
    #Gadget_Button_Close
    #Gadget_Button_Minimize
    #Gadget_Button_Maximize
    #Gadget_Button_Hide
    #Gadget_CheckBox_Hide
EndEnumeration
Structure Window
    Name.s
    Class.s
    hWnd.l
EndStructure
Structure WINDOWINFO 
    cbsize.l 
    rcWindow.RECT 
    rcClient.RECT 
    dwStyle.l 
    dwExStyle.l 
    dwWindowStatus.l 
    cxWindowBorders.l 
    cyWindowBorders.l 
    AtomWindowType.l 
    wCreatorVersion.w 
EndStructure 
NewList Window.Window()
Global Quit
Procedure.s GetWindowClass(hwnd)
    Buffer.s = Space(1000)
    GetClassName_(hWnd,@Buffer,1000)
    ProcedureReturn Buffer
EndProcedure
Procedure.s GetWindowName(hwnd)
    Buffer.s = Space(1000)
    GetWindowText_(hWnd,@Buffer,1000)
    ProcedureReturn Buffer
EndProcedure
Procedure EnumWindowsProc(hWnd,lParam)
    Name.s = GetWindowName(hWnd)
    Class.s = GetWindowClass(hWnd)
    Do.l = 1
    If GetWindowLong_(hWnd,#GWL_STYLE) & #WS_CHILD = #WS_CHILD Or GetWindowLong_(hWnd,#GWL_STYLE) & #WS_CAPTION <> #WS_CAPTION Or Trim(Name) = "" Or GetWindowLong_(hWnd,#GWL_STYLE) & #WS_POPUP = #WS_POPUP
        Do = 0
    EndIf
    If Do = 1
        AddGadgetItem(#Gadget_ComboBox_Windows,-1,name)
        AddElement(Window())
        Window()\name = name
        Window()\Class = Class
        Window()\hWnd = hWnd
    EndIf
    If hWnd 
        ProcedureReturn 1
    Else
        ProcedureReturn 0
    EndIf
EndProcedure
Procedure GetWindows()
    ClearGadgetItemList(#Gadget_ComboBox_Windows)
    ClearList(Window())
    EnumDesktopWindows_(GetThreadDesktop_(GetCurrentThreadId_()),@EnumWindowsProc(),0)
    SetGadgetState(#Gadget_ComboBox_Windows,0)
EndProcedure
Procedure OpenWindow_Main()
    If OpenWindow(#Window_Main,0,0,620,200,#PB_Window_ScreenCentered|#PB_Window_SystemMenu,"WindowsXP Topper - (C) 2005 by Leo (http://www.leoxikon.de)")
        If CreateGadgetList(WindowID())
            hComboBox = ComboBoxGadget(#Gadget_ComboBox_Windows,10,10,300,300)
            Frame3DGadget(#PB_Any,10,40,300,145,"Info")
            TextGadget(#Gadget_Text_Info,20,60,250,50,"")
            CheckBoxGadget(#Gadget_CheckBox_Forerground,20,110,200,20,"Immer in den Vordergrund setzen")
            CheckBoxGadget(#Gadget_CheckBox_Hide,20,130,200,20,"Verstecken")
            Frame3DGadget(#PB_Any,320,5,290,180,"Controls")
            ButtonGadget(#Gadget_Button_Reload,330,20,130,25,"Liste neuladen")
            ButtonGadget(#Gadget_Button_Close,470,20,130,25,"Schließen")
            ButtonGadget(#Gadget_Button_Minimize,330,55,130,25,"Minimieren")
            ButtonGadget(#Gadget_Button_Maximize,470,55,130,25,"Maximieren")
        EndIf
    EndIf
    SetFocus_(hComboBox)
EndProcedure
Procedure IsWindowTopMost(hWnd)
    TmpWInfo.WINDOWINFO
    TmpWInfo\cbsize = SizeOf(WINDOWINFO)
    GetWindowInfo_(hWnd,@TmpWInfo)
    If TmpWInfo\dwExStyle & #WS_EX_TOPMOST
        ProcedureReturn 1
    Else
        ProcedureReturn 0
    EndIf
EndProcedure
Procedure UpdateInfo()
    tString.s = ""
    If GetGadgetState(#Gadget_ComboBox_Windows) <> -1
        SelectElement(Window(),GetGadgetState(#Gadget_ComboBox_Windows))
        tString.s = "Name: "+Window()\Name
        tString.s + Chr(10)+Chr(13)
        tString.s + "Klasse: "+Window()\Class
        tString.s + Chr(10)+Chr(13)
        tString.s + "Handle: "+Str(Window()\hWnd)
    Else
        tString.s = "Sie haben keinen Eintrag ausgewählt."
    EndIf
    SetGadgetText(#Gadget_Text_Info,tString)
    SetGadgetState(#Gadget_CheckBox_Forerground,IsWindowTopMost(Window()\hWnd))
    SetGadgetState(#Gadget_CheckBox_Hide,IsWindowVisible_(Window()\hWnd)!1)
EndProcedure
Procedure SetWindowToTop(hWnd,State)
    If state = 1
        flag = #HWND_TOPMOST
    Else
        flag = #HWND_NOTOPMOST
    EndIf
    SetWindowPos_(hWnd,flag,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE)
    UpdateInfo()
EndProcedure
Procedure ChShowWindow(hWnd,State)
    If state = 1
        flag = #SW_SHOW
    Else
        flag = #SW_HIDE
    EndIf
    ShowWindow_(hWnd,flag)
EndProcedure
Procedure DoEvent(Event)
    Select Event 
        Case #PB_Event_CloseWindow 
            Quit = #True 
        Case #PB_Event_Gadget
            If GetGadgetState(#Gadget_ComboBox_Windows) <> -1
                SelectElement(Window(),GetGadgetState(#Gadget_ComboBox_Windows))
            EndIf 
            Select EventGadgetID()
                Case #Gadget_ComboBox_Windows
                    UpdateInfo()
                Case #Gadget_CheckBox_Forerground
                    SetWindowToTop(Window()\hWnd,GetGadgetState(#Gadget_CheckBox_Forerground))
                Case #Gadget_Button_Reload
                    GetWindows()
                    UpdateInfo()
                Case #Gadget_Button_Close
                    PostMessage_(Window()\hWnd,#WM_CLOSE,0,0)
                    GetWindows()
                    UpdateInfo()
                Case #Gadget_Button_Minimize
                    CloseWindow_(Window()\hWnd)
                Case #Gadget_Button_Maximize
                    ShowWindow_(Window()\hWnd,#SW_SHOWMAXIMIZED)
                Case #Gadget_CheckBox_Hide
                    ShowWindow_(Window()\hWnd,GetGadgetState(#Gadget_CheckBox_Hide)!1)
            EndSelect
    EndSelect
EndProcedure

OpenWindow_Main()
GetWindows()
UpdateInfo()

Repeat
    DoEvent(WaitWindowEvent())
Until Quit = #True 
End 
Benutzeravatar
redacid
Beiträge: 581
Registriert: 29.08.2004 17:06

Beitrag von redacid »

Danke Leo. Da ich kein WindowsXP mehr habe (nur in einer langsamen Emulation Win98) kann ich deinen Code selber nicht testen. Ich werde ihn mal weiterleiten. Kann aber ein paar Tage dauern, bis wir ihn mal richtig durchtesten konnten. Ich melde mich dann aber nochmal, ob es klappt. :allright:
Antworten