Forum | | | | | 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. |
| | | | |
| | | 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
|
| | | | |
| | | 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.)? |
| | | | |
| | | 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 |
| | | | |
| | | 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? |
| | | | |
| | | 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
|
| | | | |
| | | 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... |
| | | | |
|
AntwortenThemenoptionen | 4.100 Betrachtungen |
ThemeninformationenDieses Thema hat 1 Teilnehmer: |