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
Vielleicht hilft Dir das hier weiter:

http://www.vb-paradise.de/allgemeines/s ... nd-setzen/

Re: welches "Fenster" ist auf der Position ?

Verfasst: Mi, 29. Jun 2011 23:00
von AUGE_OHR
Tom hat geschrieben:Vielleicht hilft Dir das hier weiter:
http://www.vb-paradise.de/allgemeines/s ... nd-setzen/
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
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 ;) 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.aspx

Code: 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 :(
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 :)

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 :-)