Windows zweier Programme zusammenhängen

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Windows zweier Programme zusammenhängen

Beitrag von Rudolf »

Hallo, ich würde gerne die Fenster zweier Programme verbinden, wenn man das Hauptfenster bewegt, soll das zweite Programm immer rechts davon platziert werden. Wie kann ich also die Position des Fensters eines anderen Programmes ändern ?
Grüße
Rudolf
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: Windows zweier Programme zusammenhängen

Beitrag von HaPe »

Hallo Rudolf !
ich würde gerne die Fenster zweier Programme verbinden, wenn man das Hauptfenster bewegt, soll das zweite Programm immer rechts davon platziert werden. Wie kann ich also die Position des Fensters eines anderen Programmes ändern ?
Die Position eines Fenster kannst du mit SetWindowPos setzen: https://msdn.microsoft.com/en-us/librar ... s.85).aspx
Das benötigte Fenster-Handle bekommst du über FindWindow wenn du den Fenster-Titel kennst: https://msdn.microsoft.com/en-us/librar ... s.85).aspx
--
Hans-Peter
DelUser01

Re: Windows zweier Programme zusammenhängen

Beitrag von DelUser01 »

Hallo Rudolf

soviel ich weiß kann ein EXE eine EXE nicht (so einfach) direkt beeinflussen.
Dein zweites EXE-Fenster muss selbstständig auf die Bewegungen des ersten EXE-Fensters reagieren. Das habe ich schon gemacht, das funktioniert.
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Windows zweier Programme zusammenhängen

Beitrag von Herbert »

Wohl nicht nur beim Bewegen, sondern auch bei WM_MOVE und dem Erstellen des 2. Programms.
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Windows zweier Programme zusammenhängen

Beitrag von Rudolf »

Hallo, danke für die Antworten, aber ich glaube das wird ein wenig komplzierter. Muss auch reagieren wenn das Programm auf die Taskleiste gelegt, wieder geöffnet und geschlossen wird. Ich schicke jetzt schon Kommandos zwischen den Prgrammen herum, dann kann ich auch ein Kommando für eine neue Position oder auf Taskleiste legen dazuprogrammieren. Mit eXpress++ kann ich die Position des Hauptdialoges sehr einfach ändern.
Grüße
Rudolf

Code: Alles auswählen

function ReceiverThread()
******************************************************************
local pMsg
if !oFCSys:lInterprocess
     return .t.
endif
pMsg  := _xgrab(32)
hWndReceiver := @user32:CreateWindowExA( 0,"_OT4XB_GENERIC_WINDOW_",MY_GUID,0,0,0,0,0,-3,0,AppInstance(),0)
ot4xb_subclasswindow( hWndReceiver , ReceiverHandler() )
while @user32:GetMessageA(pMsg,0,0,0) != 0
   @user32:DispatchMessageA(pMsg)
end
_xfree( pMsg)
return NIL


CLASS ReceiverHandler
******************************************************************
EXPORTED:
INLINE CLASS METHOD wndproc(hWnd,nMsg,wp,lp)
local cds,cStr,cStatus := ""
if nMsg == WM_COPYDATA
     //altd()
   cds  := PeekDWord(lp,,3)
   cStr := PeekStr(cds[3],,cds[2])
   @user32:ReplyMessage(1) // free the sender
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Windows zweier Programme zusammenhängen

Beitrag von Martin Altmann »

Hallo Rudolf,
wenn Du das eh schon machst, ehe ich das Problem nicht? Du brauchst doch nur mit PostAppEvent() die Aktion an das zweite Fenster schicken, die gerade beim ersten ausgelöst wird. Also z.B. WM_MOVE, wenn Deines verschoben wird oder WM_MINIMIZE, wenn es verkleinert wird - etc.
Bei den Koordinaten (bei einigen der Posts in mp1 und mp2 mitgegeben) musst Du halt den Ursprung Deines Fenster nehmen und die eigene Breite addieren (wenn das andere rechts daneben angezeigt werden soll).

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Windows zweier Programme zusammenhängen

Beitrag von Rudolf »

Hallo Martin,
dachte es geht einfacher, aber sind wie schon geschrieben viele andere Dinge die ich in beiden Programmen berücksichtigen muss. Das geht nicht nur mit den Events. Mit Postappevent kann ich nur Events an XBase Parts im Programm schicken, nicht an andere Programme. Das zweite Programm hat nur ein Taskbarmenü und keinen Hauptdialog, kann also nur angezeigt und verschoben werden wenn ein spezieller Dialog offen ist. Und wenn das zweite Programm nicht mehr genug Platz rechts vom Hauptprogramm hat, musss ich das Hauptprogramm auch nach links verschieben.
Grüße
Rudolf
DelUser01

Re: Windows zweier Programme zusammenhängen

Beitrag von DelUser01 »

Rudolf hat geschrieben:Ich schicke jetzt schon Kommandos zwischen den Prgrammen herum, dann kann ich auch ein Kommando für eine neue Position oder auf Taskleiste legen dazuprogrammieren.
Wie machst Du denn die Kommunikation zwischen den EXEs?

Ich benutze eine gemeinsame DBF.
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: Windows zweier Programme zusammenhängen

Beitrag von HaPe »

Hallo Zusammen !
Wie machst Du denn die Kommunikation zwischen den EXEs?
Da gibt es mehrere Möglichkeiten:
- Mit File-IN/OUT wie Roland das macht und die Ziel-EXE permanent auf Änderungen prüfen muß
- SendMessage mit WM_COPYDATA
- In ein SharedMemory die Daten schreiben und dann mit SendMessage und einem Event-Handler in der Ziel-EXE auf die Anforderung reagieren
--
Hans-Peter
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: Windows zweier Programme zusammenhängen

Beitrag von AUGE_OHR »

Rudolf hat geschrieben:Das zweite Programm hat nur ein Taskbarmenü
ich schätze mal das du kein Handle auf das TaskbarMenu bekommst mit FindWindow().
ich "denke" das die Icons im TaskTray "anders" angesprochen werden ... muss mal suche ob ich ein Demo finde.
gruss by OHR
Jimmy
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Windows zweier Programme zusammenhängen

Beitrag von Rudolf »

Hallo, im OT4XB Source von mir ist eigentlich alles definiert, ich brauche keine Files, geht direkt über den receiver Thread. In beiden Programmen läuft dieser Thread über den ich dann Messages senden und darauf reagieren kann.
Grüße
Rudolf
DelUser01

Re: Windows zweier Programme zusammenhängen

Beitrag von DelUser01 »

OK - wenn ich das richtig verstehe suchst Du einen anderen, einfacheren Weg zwei Fenster zu verbinden, ohne dass Du das ganze Zeugs über Deine Interprozesskommunikation erst einbauen musst :-)
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Windows zweier Programme zusammenhängen

Beitrag von Rudolf »

Hallo Roland,
ich dachte genau das am Anfang, aber jetzt sehe ich dass es über die Interprocess Kommunikation doch flexibler und besser ist. Habe es mir einfacher vorgestellt, einfach beim Start die Position rechts neben dem Hauptprogramm anordnen und dann mit dem Hauptfenster verschieben. Aber wie schon geschrieben gibt es ein paar spezielle Situationen die ich auch berücksichtigen muss.
Grüße
Rudolf
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: Windows zweier Programme zusammenhängen

Beitrag von AUGE_OHR »

Rudolf hat geschrieben:In beiden Programmen läuft dieser Thread über den ich dann Messages senden und darauf reagieren kann.
wenn es sich um ot4xb handelt solltest du bei Pablo die Frage stellen ...
ich gehe mal davon aus das du WM_COPYDATA meinst ?
gruss by OHR
Jimmy
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Windows zweier Programme zusammenhängen

Beitrag von Rudolf »

Hallo Jimmy, siehe Beispielcode den ich gepostet habe.
Grüße
Rudolf
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: Windows zweier Programme zusammenhängen

Beitrag von AUGE_OHR »

Rudolf hat geschrieben:siehe Beispielcode den ich gepostet habe.
habe ich gesehen und frage deshalb ja nach.

der Code Snipe sagt gar nichts ... keine CopyData Structure oder sonstige Registrierung sichtbar.
zudem fehlt ja der Callback oher den gar nichts funktioniert.

nun willst du ja etwas im TaskTray aktivieren ...

Code: Alles auswählen

function ReceiverWndProc( hWnd , nMsg , wp , lp )
local aData                                          

if( nMsg == WM_COPYDATA )
     ...
     // SetForegroundWindow()  not always work from external threads of 
     // the destination window so we post a custom Xbase++ event and call
     // SetForegroundWindow() from the CRT main loop
deshalb kam ich darauf das man noch was "anderes" benötigt wenn man es aus dem TaskTray Bereiche holen will ...
ich habe aber noch nicht das Demo dazu gefunden ... ich such weiter

ansonsten wie schon gesagt solltest du Pablo fragen ... das ist kein Xbase++ Level mehr.
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: Windows zweier Programme zusammenhängen

Beitrag von AUGE_OHR »

so ich "denke" das waren die Zeile die ich suchte.

Code: Alles auswählen

oSysTray := TaskBarIcon():New(xbeP_User+30):Create()
oSysTray:AddIcon( 1, SEIKO_ICO, "Seiko label print scanner")
SetAppWindow():Hide()
In your event loop, you have to check for zbeP_User+30 and show the window again.
der Trick war beim Anlegen des TaskbarIcon einen Event zu übergeben den man später nutzten kann.
gruss by OHR
Jimmy
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Windows zweier Programme zusammenhängen

Beitrag von Rudolf »

Hallo Jimmy,
mit Taskbar hab ich kein Problem, wenn ich mehr habe poste ich es hier. Aber die Interprocess Kommunikation funktioniert einwandfrei bei mir.
Grüße
Rudolf
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: Windows zweier Programme zusammenhängen

Beitrag von AUGE_OHR »

Rudolf hat geschrieben:Das zweite Programm hat nur ein Taskbarmenü und keinen Hauptdialog
hm ... wie geht das ?
Rudolf hat geschrieben:mit Taskbar hab ich kein Problem.
die Taskbar und nicht der TaskTray rechts unten bei der Uhr ?
dann hab ich das wohl falsch verstanden.
Rudolf hat geschrieben:Und wenn das zweite Programm nicht mehr genug Platz rechts vom Hauptprogramm hat, musss ich das Hauptprogramm auch nach links verschieben.
das ist doch "nur" rechnen.

die 2nd App rechts hat doch ein Minimum

Code: Alles auswählen

   oDialog:minSize := MyMinSize
klar muss das 1st Fenster die Konstante MyMinSize kennen damit er damit "rechnen" kann.
gruss by OHR
Jimmy
Antworten