Seite 1 von 1
welches "Fenster" ist auf der Position ? [erledigt]
Verfasst: Mi, 29. Jun 2011 6:27
von AUGE_OHR
hi,
wenn ich aus "meiner" Xbase++ Application etwas "drag"(gen) möchte bekomme ich bei Lb_UP zwar die Positionen
aber wie finde ich das "Fenster" an "der" Position ?
ich kann ja durch die Taskliste gehen und hätte das "Handle" von jeden Programm ... und wie komme ich damit an aPos / aSize ?
wenn ich nun "Handle" des "anderen" Programm raus-gefunden habe kann ich meine "DropFiles" STRUCTURE ***
an das "anderen" Programm "senden"
Code: Alles auswählen
SendMessageA(nHandleAppclication,WM_DROPFILES,DropFiles,0)
***
STRUCTURE POINT
http://msdn.microsoft.com/en-us/library ... S.85).aspx
STRUCTURE DROPFILES
http://msdn.microsoft.com/en-us/library ... S.85).aspx
Re: welches "Fenster" ist auf der Position ?
Verfasst: Mi, 29. Jun 2011 22:25
von AUGE_OHR
hi,
auch Pablo hat "auf die schnelle" keine Antwort
... aber es muss doch gehen den andere "Tools" wie WinID können das ja auch.
WinID zeigt mir ja immer die Property von dem "Fenster" an wo ich mit der Maus stehe.
leider hab ich kein "Stichwort" und damit zu suchen ... jemand eine Idee ?
Re: welches "Fenster" ist auf der Position ?
Verfasst: Mi, 29. Jun 2011 22:33
von Tom
Re: welches "Fenster" ist auf der Position ?
Verfasst: Mi, 29. Jun 2011 23:00
von AUGE_OHR
JaJaJa ... mit
GetWindowRect(nHandle,aRect) bekomme ich die Ausmasse des Fensters =D>
... nun muss ich "nur" noch raus finden "wo" (Position) das "Fenster" liegt.
Analoge zu
GetWindowRect() müsste es ja ein
GetWindowPos() geben ...
Re: welches "Fenster" ist auf der Position ?
Verfasst: Mi, 29. Jun 2011 23:09
von Tom
Re: welches "Fenster" ist auf der Position ?
Verfasst: Do, 30. Jun 2011 0:21
von AUGE_OHR
hehe ... wenn man erst mal ein Stichwort hat, DANKE !
ich bin auch darauf gestossen, aber man braucht dafür eine STRUCTURE
<StructLayout(LayoutKind.Sequential)> _
Private Structure WINDOWPLACEMENT
Public Length As Integer
Public flags As Integer
Public showCmd As Integer
Public ptMinPosition As POINTAPI
Public ptMaxPosition As POINTAPI
Public rcNormalPosition As RECT
End Structure
<StructLayout(LayoutKind.Sequential)> _
Private Structure POINTAPI
Public x As Integer
Public y As Integer
End Structure
<StructLayout(LayoutKind.Sequential)> _
Private Structure RECT
Public Left As Integer
Public Top As Integer
Public Right As Integer
Public Bottom As Integer
End Structure
so mal sehen wie ich nun die Puzzle Teile zusammen bekomme.
p.s. ich weiss das es sich mit SendMessage() um eine "alte" Dragdrop Methode handelt.
die "moderne" Variante arbeitet per OLE ... was mir aber (noch) "zu Hoch" ist ...
Re: welches "Fenster" ist auf der Position ?
Verfasst: Do, 30. Jun 2011 2:16
von AUGE_OHR
hi,
ich habe mir also nun die
STRUCTURE angelegt ( mit ot4xb ) und es ausprobiert.
es funktioniert zwar noch nicht "richtig" aber es reicht um evtl. einen "Denkfehler" zu offenbaren.
wir sind ja nicht mehr bei Windows V1.x wo es noch keine "überlappenden" Dialoge gab ...
an der Stelle wo ich das "Drop" machen möchte muss ja nicht "nur" 1 "Fenster" liegen ... es könnte "darunter" ja noch ein "Fenster" sein ...
ich müsste also eine "Z-Ebene" einbauen die "erkennt" wie die "Fenster" angeordnet sind um das "oberste" was passt auszuwählen.
... oder ist die Taskliste "sortiert" ? ich meine das dass "aktive" Programm doch als oberstes aufgelistet wird ... und der "Rest" dann "nach unten" ?
Nachtrag : ich habe wohl "Glück" denn die Z-Reihenfolge "scheint" tatsächlich zu stimmen
als "Beweis" bringe ich das "Fenster" nun in den Vordergrund ... jetzt muss "nur" noch das "drop" eingeleitet werden ...
2nd Nachtrag : das war nicht ganz ins schwarze ... irgendwie verstehe ich die Koordinaten nicht
![WINDOWPLACEMENT.JPG](./download/file.php?id=1003&sid=a6cd16439de8007526c68ff61bcb0288)
- WINDOWPLACEMENT.JPG (61.69 KiB) 5068 mal betrachtet
Code: Alles auswählen
c := oWin:rcNormalPosition
d := c:Left
e := c:Top
f := c:Right
g := c:Bottom
IF aDropPos[1] >= c:Left .AND. aDropPos[1] <= c:Right .AND. ;
aDropPos[2] >= c:Top .AND. aDropPos[2] <= c:Bottom
lRet := .T.
ELSE
MSGBOX("nicht drin "+cWind+CRLF+;
VAR2CHAR(aDropPos)+CRLF+;
VAR2CHAR(a:x)+" "+VAR2CHAR(a:y)+CRLF+;
VAR2CHAR(b:x)+" "+VAR2CHAR(b:y)+CRLF+;
VAR2CHAR(d)+CRLF+;
VAR2CHAR(e)+CRLF+;
VAR2CHAR(f)+CRLF+;
VAR2CHAR(g) )
ENDIF
wer hat eine Idee ?
Re: welches "Fenster" ist auf der Position ?
Verfasst: Do, 30. Jun 2011 8:04
von brandelh
Hi,
wenn es sich bei deinen Fenstern um Xbase++ Fenster handelt, kannst du mit GetPointerPos() herausbekommen wo der Cursor aktuell ist (bezogen auf den Desktop)
und mit der Methode mapPoint() kannst du umrechnen wo das in einem deiner Fenster wäre. Das ist eine Methode von XbpWindow().
Re: welches "Fenster" ist auf der Position ?
Verfasst: Do, 30. Jun 2011 22:12
von AUGE_OHR
brandelh hat geschrieben:wenn es sich bei deinen Fenstern um Xbase++ Fenster handelt, kannst du mit GetPointerPos() herausbekommen wo der Cursor aktuell ist (bezogen auf den Desktop)
das mache ich soweit und bekomme das "richtige" Ergebniss {70,68}
brandelh hat geschrieben:und mit der Methode mapPoint() kannst du umrechnen wo das in einem deiner Fenster wäre. Das ist eine Methode von XbpWindow().
hm ... JA das ist es !!! ich muss wohl "umrechnen"
Code: Alles auswählen
LOCAL nHigh := AppDesktop():CurrentSize()[2] // Top-Down
e := nHigh-c:Top
g := nHigh-c:Bottom
dann machen die Werte auch einen Sinn
![Wink ;)](./images/smilies/wink.gif)
DANKE !
Re: welches "Fenster" ist auf der Position ?
Verfasst: Fr, 01. Jul 2011 3:28
von AUGE_OHR
hi,
laut Pablo gibt es eine API Function
WindowFromPoint() http://msdn.microsoft.com/en-us/library ... 85%29.aspxCode: Alles auswählen
INLINE METHOD WindowFromPoint(aDropPos)
LOCAL nHwnd := 0
LOCAL aPos := ::POINT():NEW() // POINT Structure
// zuweisen an Structure
aPos:x := aDropPos[1]
aPos:y := aDropPos[2]
nHwnd := @USER32:WindowFromPoint(aPos)
nHwnd := @USER32:WindowFromPoint({aPos:x,aPos:y})
nHwnd := @USER32:WindowFromPoint(aDropPos)
nHwnd := @USER32:WindowFromPoint({aDropPos[1],aDropPos[2]})
IF nHwnd > 0
@user32:ShowWindow( nHwnd, SW_RESTORE )
@user32:BringWindowToTop( nHwnd )
@user32:SetForegroundWindow( nHwnd )
ENDIF
RETURN nHwnd
aber ich bekomme immer nur 0 ... auch mit "umrechnen" bei "Top-down" Koordinaten
![Sad :(](./images/smilies/sad.gif)
hat jemand eine Idee ?
Re: welches "Fenster" ist auf der Position ?
Verfasst: Fr, 01. Jul 2011 4:11
von AUGE_OHR
hi,
obwohl Pablo und M$ sagen das es ein Array oder STRUCTURE sein soll funktioniert es damit
Code: Alles auswählen
INLINE METHOD WindowFromPoint(aDropPos)
LOCAL nHwnd := 0
nHwnd := @USER32:WindowFromPoint( aDropPos[1],aDropPos[2] )
IF nHwnd > 0
@user32:ShowWindow( nHwnd, SW_RESTORE )
@user32:BringWindowToTop( nHwnd )
@user32:SetForegroundWindow( nHwnd )
ENDIF
RETURN nHwnd
das ist natürlich viel eleganter als die Tasklist abzuarbeiten
![Smile :)](./images/smilies/smile.gif)
Re: welches "Fenster" ist auf der Position ? [erledigt]
Verfasst: Sa, 02. Jul 2011 3:30
von AUGE_OHR
hi,
es steht doch "richtig" bei M$ ... man muss nur auf genau auf die Syntax achten
the param is POINT instead of POINT* so must provide the agregates instead of a pointer
AUGE_OHR hat geschrieben:Code: Alles auswählen
SendMessageA(nHandleAppclication,WM_DROPFILES,DropFiles,0)
Tja das macht wohl doch was "anderes" als ich erhofft hatte ...
>> i just "think" : if i can "receive" DROPFILES Structure,
>> why cant I "send" it ?
>Ask Bill gates why is not documented and why file explorer no longer handle it
![Smile :-)](./images/smilies/smile.gif)