welches "Fenster" ist auf der Position ? [erledigt]

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

welches "Fenster" ist auf der Position ? [erledigt]

Beitrag 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
Zuletzt geändert von AUGE_OHR am Fr, 01. Jul 2011 4:12, insgesamt 1-mal geändert.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: welches "Fenster" ist auf der Position ?

Beitrag 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 ?
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: welches "Fenster" ist auf der Position ?

Beitrag von Tom »

Vielleicht hilft Dir das hier weiter:

http://www.vb-paradise.de/allgemeines/s ... nd-setzen/
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: welches "Fenster" ist auf der Position ?

Beitrag 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 ...
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: welches "Fenster" ist auf der Position ?

Beitrag von Tom »

Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: welches "Fenster" ist auf der Position ?

Beitrag 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 ...
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: welches "Fenster" ist auf der Position ?

Beitrag 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) 4935 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 ?
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: welches "Fenster" ist auf der Position ?

Beitrag 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().
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: welches "Fenster" ist auf der Position ?

Beitrag 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 !
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: welches "Fenster" ist auf der Position ?

Beitrag 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 ?
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: welches "Fenster" ist auf der Position ?

Beitrag 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 :)
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: welches "Fenster" ist auf der Position ? [erledigt]

Beitrag 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 :-)
gruss by OHR
Jimmy
Antworten