Deutsch
Forum

Fenstertitel in Editierfeld übernehmen

 
Hallo alle zusammen...

Ich möchte in meinem Programm die Möglichkeit haben, einen beliebigen Fenstertitel eines laufenden Programmes in ein mehrzeiliges Editierfeld aufzunehmen. Wie würdet ihr an die Sache herangehen? Wie kann man das logisch realisieren? Was wäre die beste Möglichkeit?
Wäre für jeden Vorschlag dankbar, Quelltexte sind nicht unbedingt nötig.
 
16.07.2004  
 



Meinst Du sowas?
 {$cr}
declare a#,x%,y%,wnd&,me&
dim a#,8
def WindowFromPoint(2) !"USER32", "WindowFromPoint"
def GetCursorPos(1) !"USER32","GetCursorPos"
windowstyle 536
windowtitle "WinTit"
window 0,0 - 400,350
cls rgb(196,196,196)
me&=createmultiedit(%hwnd,"",0,0,width(%hwnd),height(%hwnd))
settimer 250

repeat

    Waitinput

    ifnot %key

        GetCursorPos(a#)
        let x%=long(a#,0)
        let y%=long(a#,4)
        let Wnd&=WindowFromPoint(x%,y%)
        settext me&, gettext$(Wnd&)

    endif

until %key=2

killtimer
dispose a#
end
 
16.07.2004  
 



Hallo IF...

Nein, eigentlich nicht. Wie man an den Fenstertitel kommt, weiß ich - mir fehlt eine Idee für eine logische Umsetzung....
In meinem Programm gibt es ein mehrzeiliges Editierfeld, in das man Fenstertitel eingeben kann, bei deren Auftreten Windows automatisch herunterfährt. Ich möchte nun den Anwender nicht ganz so viel schreiben lassen - es soll aber für den Anwender auch nachvollziehbar sein, was er da gerade tut.
Ich habe schon an eine Möglichkeit mittels Trackmenü gedacht:
Nach Rechtsklick auf eine Fenstertitelzeile öffnet sich ein Trackmenü mit der Option als verbotenes Programm definieren.
Jetzt beim Schreiben fällt mir auch noch was für Drag and Drop ein:
Durch das Drücken der rechten Maustaste kann man (nur) die Titelzeile des Fensters bis zu meinem Programm auf das Editierfeld ziehen und dort ablegen durch das Loslassen der Maustaste ablegen.

Das wären schon mal zwei Sachen, die programmtechnisch ganz einfach zu lösen sind. Gibt es weitere Möglichkeiten? Was ist einleuchtender und besser zu bedienen? Gibt es irgendwelche Probleme mit einem Rechtsklick in die Titelzeile eines Fensters (andere Menüs, die sich öffnen... etc.)?
 
16.07.2004  
 



Was hältst davon, einfach alle Window-Titles die nur irgendwie auftauchen einfach in eine list zu tun, und daraus auswählbar zu machen. In die List könnte ein Titel, welcher Grade als Activewin ist.

Quasi:

case oldactivewindowtitle<>activewindowtitle : pushtolist activewindowtitle
 
16.07.2004  
 



Hallo IF...

Wenn ich dich da jetzt richtig verstanden habe, wollte ichs eigentlich so einfach auch nicht haben .
Ich hatte da eher an so etwas gedacht:
WINDOWTITLE "Fenstertitel in Editbox ziehen"
Windowstyle 31
Window 0,0-640,400
Declare Cursor#,Curx&,Cury&,Windowhandle&,Windowhandle2&
Declare Fenstertitel$,EDIT&,EDITZähler&,TEST&,Test$
Declare Drop&,Breite&,Windowhandle3&
Def @GetAsyncKeyState(1) !"User32","GetAsyncKeyState"
Def @WindowFromPoint(2) !"USER32", "WindowFromPoint"
Def @GetCursorPos(1) !"USER32","GetCursorPos"
DEF ChildWindowFromPoint(3) !"USER32","ChildWindowFromPoint"
Def ScreenToClient(2) !"USER32","ScreenToClient"
@GetAsyncKeyState(2)
LET EDIT&=@createmultiedit(%HWND,"",10,10,300,300)

While @equ(0,0)

    IF @GetAsyncKeyState(2)<>0

        Dim Cursor#,8
        @GetCursorPos(Cursor#)
        let Curx&=long(Cursor#,0)
        let Cury&=long(Cursor#,4)
        LET Windowhandle&=@WindowFromPoint(Curx&,Cury&)
        LET Fenstertitel$=@GetText$(Windowhandle&)
        LET Breite&=@Width(Windowhandle&)

        If Fenstertitel$<>""

            Windowstyle 16
            Let Drop&=@createwindow(%Desktop,Fenstertitel$,Curx&,Cury&,Breite&,0)
            SetWindowPos %HWND=0,0-640,400;-1

            While @GetAsyncKeyState(2)<>0

                @GetCursorPos(Cursor#)
                let Curx&=long(Cursor#,0)
                let Cury&=long(Cursor#,4)
                SetWindowPos Drop&=Curx&,Cury&-Breite&,0;-1
                @GetCursorPos(Cursor#)
                let Curx&=long(Cursor#,0)
                let Cury&=long(Cursor#,4)
                LET Windowhandle&=@WindowFromPoint(Curx&,Cury&)

                If Windowhandle&<>0

                    @ScreenToClient(Windowhandle&,Cursor#)
                    LET Curx&=Long(Cursor#,0)
                    LET Cury&=Long(Cursor#,4)
                    LET Windowhandle3&=@ChildWindowFromPoint(Windowhandle&,Curx&,Cury&)
                    Case Windowhandle3&<>0 : LET Windowhandle2&=Windowhandle3&

                EndIf

            wend

            @GetCursorPos(Cursor#)
            let Curx&=long(Cursor#,0)
            let Cury&=long(Cursor#,4)
            LET Windowhandle&=@WindowFromPoint(Curx&,Cury&)

            If Windowhandle&<>0

                @ScreenToClient(Windowhandle&,Cursor#)
                LET Curx&=Long(Cursor#,0)
                LET Cury&=Long(Cursor#,4)
                LET Windowhandle3&=@ChildWindowFromPoint(Windowhandle&,Curx&,Cury&)
                Case Windowhandle3&<>0 : LET Windowhandle2&=Windowhandle3&

            EndIf

            IF Windowhandle2&=Edit&

                Usecursor 2
                Let EDITZähler&=0
                Clearlist
                ADDSTRING Fenstertitel$

                While EDITZähler&<@GetLineCount(Edit&)

                    ADDSTRING @Getline$(EDIT&,Editzähler&)
                    Let EDITZähler&=Editzähler&+1

                wend

                @MoveListToEdit(Edit&)
                Usecursor 0
                setmenuitem 0
                @setfocus(%HWND)

            endif

            @destroywindow(Drop&)

        endif

        Dispose Cursor#
        SetWindowPos %HWND=0,0-640,400;1

    endif

wend


... oder auch so was:
WINDOWTITLE "Erfassen des Fenstertitels mit Trackmenü"
Windowstyle 31
Window 0,0-640,400
Declare Cursor#,Curx%,Cury%,Windowhandle&
Declare Fenstertitel$,EDIT&,EDITZähler&,TEST&,Test$
Def @GetAsyncKeyState(1) !"User32","GetAsyncKeyState"
Def @WindowFromPoint(2) !"USER32", "WindowFromPoint"
Def @GetCursorPos(1) !"USER32","GetCursorPos"
@GetAsyncKeyState(2)
LET EDIT&=@createmultiedit(%HWND,"",10,10,300,300)
CreateMenu
AppendMenu 433,"&Fenstertitel an Editbox senden"

While @equ(0,0)

    IF @GetAsyncKeyState(2)<>0

        Dim Cursor#,8
        @GetCursorPos(Cursor#)
        let Curx%=long(Cursor#,0)
        let Cury%=long(Cursor#,4)
        Dispose Cursor#
        LET Windowhandle&=@WindowFromPoint(Curx%,Cury%)
        LET Fenstertitel$=@GetText$(Windowhandle&)

        IF @neq$(Fenstertitel$,"")

            CreateMenu
            AppendMenu 433,"&Fenstertitel an Editbox senden"
            sleep 100
            TrackMenu Curx%-100,Cury%

            IF @MENUITEM(433)

                Usecursor 2
                Let EDITZähler&=0
                Clearlist
                ADDSTRING Fenstertitel$

                While EDITZähler&<@GetLineCount(Edit&)

                    ADDSTRING @Getline$(EDIT&,Editzähler&)
                    Let EDITZähler&=Editzähler&+1

                wend

                @MoveListToEdit(Edit&)
                Usecursor 0
                setmenuitem 0
                @setfocus(%HWND)
                @GetAsyncKeyState(2)

            endif

        endif

    endif

wend


... aber wie du siehst, ist das alles nicht so ganz ideal. Kann man da irgendwo noch was verbessern?
 
17.07.2004  
 



Nun, ich finde folgende Variante wohl am ehrlichsten, verbraucht auch nicht 100%Rechenleistung, und habs mal schnell dahingepinselt:

 {$crq}
declare winlist$,wintit$,owintit$,vlb&,mov&,edit&,tmps$
windowtitle "Erfassen des Fenstertitels mit Trackmenü"
Windowstyle 31+512
Window 0,0-640,400
setwindowpos %hwnd=0,0 - 640,400;-1
EDIT&:=@createmultiedit(%HWND,"",10,10,300,300)
vlb&:=createsortedlistbox(%hwnd,"",350,10,sub(width(%hwnd),370),300)
mov&:=createbutton(%hwnd,"<",315,10,30,300)
winlist$:=""
owintit$:=""
wintit$:=""
settimer 333

repeat

    waitinput
    pushtolist gettext$(getactivewindow())

    if or(getfocus(vlb&),getfocus(mov&))

        tmps$:=getstring$(vlb&,getcursel(vlb&))

        if len(tmps$)

            enablewindow mov&,1

            if getfocus(mov&)

                settext edit&,gettext$(edit&)+tmps$+chr$(13)+chr$(10)
                setfocus(vlb&)

            endif

        else

            enablewindow mov&,0

        endif

    else

        enablewindow mov&,0

    endif

until %key=2

killtimer
end

proc pushtolist

    parameters tx$
    wintit$=lower$(trim$(tx$))

    if len(wintit$)

        if owintit$<>wintit$

            owintit$:=wintit$

            ifnot instr("°"+wintit$,winlist$)

                winlist$:=winlist$+"°"+wintit$
                addstring(vlb&,wintit$)

            endif

        endif

    endif

endproc

 
17.07.2004  
 



Hallo IF...

Also doch richtig verstanden...
Das sieht auf jeden Fall eine ganze Ecke besser aus als meine Idee mit dem Trackmenü. Da mein Fenster aber schon ziemlich vollgepackt ist, wirds da wohl für diese Lösung etwas zu eng werden. Ich hab mich deshalb vorerst mal für den verschiebbaren Fenstertitel entschieden.
Da das Programm sowieso wohl nur 2 Minuten am Stück läuft, und dies ohne das weitere aufwendige Programme laufen, habe ich die Prozessorauslaustung erst mal außer acht gelassen. Trotzdem vielen Dank für den Hinweis - wird vielleicht doch noch wichtig...
 
19.07.2004  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

4.100 Betrachtungen

Unbenanntvor 0 min.
Ernst22.04.2016
Jochen Roxlau03.10.2014
Michaeal18.10.2012
Julian Schmidt07.06.2011

Themeninformationen

Dieses Thema hat 1 Teilnehmer:

unbekannt (7x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie