Seite 1 von 1

Programm in den Vordergrund bringen [ERLEDIGT]

Verfasst: Fr, 13. Aug 2010 20:53
von georg
Guten Abend -


mein Programm lauert im Hintergrund auf ein Drag-and-Drop vom Browser. Nach dem Drag-and-Drop versuche ich, das Fenster in den Vordergrund zu bringen:

Code: Alles auswählen

SetAppWindow(RootWindow())
SetAppFocus(oXbp)
Nützt nur leider nichts, was mache ich gedanklich falsch?


Georg

Re: Programm in den Vordergrund bringen

Verfasst: Fr, 13. Aug 2010 21:27
von AUGE_OHR
georg hat geschrieben:mein Programm lauert im Hintergrund auf ein Drag-and-Drop vom Browser. Nach dem Drag-and-Drop versuche ich, das Fenster in den Vordergrund zu bringen:

Code: Alles auswählen

SetAppWindow(RootWindow())
SetAppFocus(oXbp)
Nützt nur leider nichts, was mache ich gedanklich falsch?
Dein Programm und der Browser sind 2 Applicationen.

Frage : wie "schaltest" du von einer Application zu anderen ?

per Keyboard macht man das ja mit ALT-TAB ... und auf was "wirkt" es dann ?
Es ist die Tasklist, also musst du da ansetzen.

such mal im Forum nach GetTaskList(). Wenn du dann den Namen deiner Application vorgibst und das Handle hast kannst du mit

Code: Alles auswählen

    nHwnd := VAL( LEFT( aTasklist[ i ], 8 ) )
    ShowWindow( nHwnd, SW_RESTORE )
    BringWindowToTop( nHwnd )
    SetForegroundWindow( nHwnd )
deine Application in den Vordergrund bringen.

Re: Programm in den Vordergrund bringen

Verfasst: Sa, 14. Aug 2010 2:20
von brandelh
Hi,

das Problem wird sein, dass er erstmal in die Ereignisverwaltung der Xbase++ Anwendung kommt.
Ich vermute dass DRAG im Internetexplorer erzeugt wird und aus diesem ein DROP in das Xbase++ Programmfenster erfolgt.

Hierzu muss dieses das DROP Ereignis verarbeiten, wobei dieses "direkt" geschieht.
Hierzu bitte in der Hilfe zu XbpWindow ansehen:
:dropZone
:dragDrop ... Event ... xbeP_DragDrop == Objekt wurde in ein Drop Zone-Objekt fallengelassen.
in diesem codeblock müsste dann ein RootWindow():show() bzw. :toFront() oder setappfocus(...)
aber diese Verarbeitung muss schnell gehen !!!!

Re: Programm in den Vordergrund bringen

Verfasst: Sa, 14. Aug 2010 6:23
von georg
Hallo,


normalerweise ziehe ich den Link auf das Icon in der Taskleiste.

GetTastList() habe ich zwar gefunden, allerdings bekomme ich:

unresolved external GETWINDOW

sowie eine nicht deklarierte Variable GW_HWNDNEXT.

Ausserdem fehlt mir die Definition von

ShowWindow()
BringWindowToTop()
SetForegroundWindow()


Gruss,

Georg

Re: Programm in den Vordergrund bringen

Verfasst: Sa, 14. Aug 2010 8:43
von Günter Beyes
Hallo Georg,

versuche es mal mit ::setframestate(XBPDLG_FRAMESTAT_NORMALIZED) im DragDrop-Handler. (Es geht um Windows 7, nicht wahr?)

Gruß,
Günter

Re: Programm in den Vordergrund bringen

Verfasst: Sa, 14. Aug 2010 10:31
von georg
Hallo, Günther -


korrekt, es geht um Windows 7, 64bit. Browser ist FireFox.

Ich habe Deinen Vorschlag versucht, aber das Programm bleibt immer noch im Hintergrund.


Gruss,

Georg

Re: Programm in den Vordergrund bringen

Verfasst: Sa, 14. Aug 2010 11:13
von Günter Beyes
Hallo Georg,

ich nehme an, es funktioniert, wenn du andere, nicht mit Xpp erstellte Anwendungen als Drop-Ziel nimmst. Wird denn der DragDrop-Handler deiner Anwendung ausgeführt, wenn du ein Element auf das Taskbar-Icon fallen lässt?

Gruß,
Günter

Re: Programm in den Vordergrund bringen

Verfasst: Sa, 14. Aug 2010 12:07
von Rolf Ramacher
Hi Georg,

was passiert denn bei SetAppFocus(oDlg) ?

Re: Programm in den Vordergrund bringen

Verfasst: Sa, 14. Aug 2010 12:40
von Tom
SetAppFocus() bezieht sich nur auf die App selbst, also den Focus innerhalb der App, daher auch diese drei Buchstaben im Namen der Funktion. :wink: ToFront() legt die Z-Order von Objekten (nachträglich) fest und bezieht sich auch nur auf die App bzw. sogar nur auf einzelne Dialoge. Der einzige Ansatz, der bei Interaktion von mehreren Programmen funktioniert, ist der von Jimmy (API) - es sei denn, Firefox verhindert das an dieser Stelle aktiv.

Re: Programm in den Vordergrund bringen

Verfasst: Sa, 14. Aug 2010 12:42
von Tom
Ergänzung: Man kann auch mit oDlg:AlwaysOnTop := .T./.F. herumspielen, vorausgesetzt, es handelt sich nicht um Kinderfenster innerhalb einer MDI-Applikation. Aber das ist mit Vorsicht zu genießen, weil bei AlwaysOnTop := .T. wirklich nichts mehr in den Vordergrund gelangen kann.

Re: Programm in den Vordergrund bringen

Verfasst: Sa, 14. Aug 2010 12:44
von Tom

Code: Alles auswählen

FUNCTION DlgToFront(oDlg)
LOCAL nDlgHandle:=oDlg:GetHwnd()
BringWindowToTop( nDlgHandle )
SetForegroundWindow( nDlgHandle )
RETURN NIL

Code: Alles auswählen

DLLFUNCTION BringWindowToTop( nHwnd )           USING STDCALL FROM USER32.DLL
DLLFUNCTION SetForegroundWindow( nHwnd )        USING STDCALL FROM USER32.DLL

Re: Programm in den Vordergrund bringen

Verfasst: Sa, 14. Aug 2010 14:33
von Günter Beyes
Hallo Tom.

wirkt das, wenn die Anwendung zum Taskleisten-Icon minimiert ist?

Gruß,
Günter

Re: Programm in den Vordergrund bringen

Verfasst: Sa, 14. Aug 2010 14:59
von Tom
Womit?

Re: Programm in den Vordergrund bringen

Verfasst: Sa, 14. Aug 2010 16:19
von AUGE_OHR
Günter Beyes hat geschrieben:wirkt das, wenn die Anwendung zum Taskleisten-Icon minimiert ist?
zumindest unter XP und Win7 32bit.
georg hat geschrieben:unresolved external GETWINDOW
hm ... ich habe die Function doch mehrfach im Forum gepostet ...auch die anderen Functionen ...
georg hat geschrieben:sowie eine nicht deklarierte Variable GW_HWNDNEXT.
hm ... ok die finde ich auch nicht beim "suchen" im Forum, sorry.

Code: Alles auswählen

#define GW_HWNDFIRST        0
#define GW_HWNDLAST         1
#define GW_HWNDNEXT         2
#define GW_HWNDPREV         3
#define GW_OWNER            4
#define GW_CHILD            5
#define GW_MAX              5
p.s. mit dern Functionen kannst du auch :
a.) verhindern das deine Application 2x gestartet wird
b.) eine Application "abschiessen" ( WM_CLOSE , WM_QUIT )

... und wenn du das Handle einer "anderen" Application hast kommst du sogar, mit FindWindow(), an die einzelnen Child´s des "Fenster".
Damit kannst du z.b. den Wert des "Rechner" (Calc) "auslesen" und in dein SLE übernehmen (ohne DragDrop)
http://www.xbaseforum.de/viewtopic.php?f=27&t=4422

Re: Programm in den Vordergrund bringen

Verfasst: Sa, 14. Aug 2010 17:40
von georg
Hallo,


danke für die verschiedenen Hinweise, werde denen gleich mal nachgehen.

Zum Ablauf: mein Programm (ein Unterstützungsprogramm für Moderatoren) läuft als Fenster auf dem Desktop, aber im Hintergrund. Ich ziehe den entsprechenden Link auf das Icon in der Taskleiste, warte einen Moment, bis Windows 7 das Fenster in den Vordergrund pusht, ziehe den Link etwas nach oben (meine Taskleiste ist unten) und lasse ihn auf dem Programmfenster fallen. Jetzt geht Firefox wieder in den Vordergrund, mein Programm lädt Informationen aus dem Board und soll dann in den Vordergrund kommen, damit ich schneller weitermachen kann.

@Tom: mit Deinem Beispiel habe ich es hinbekommen, vielen Dank, auch an alle anderen, die mitgeholfen haben,


Gruss,

Georg