Autor Beitrag
Hendrik
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324



BeitragVerfasst: Fr 19.09.03 16:10 
Hi!


Ich hatte schonmal vor einiger Zeit gefragt, wie ich ein Programm, das seine Parameter mittels Windowsmessage an ein anderes sendet, unbemerkt ausführen kann. D.h. ohne, dass es durch das Ausführen des Proggis zu Behinderungen kommt. Da wurde mir geraten, dass ich möglichst alles direkt in den Projektquelltext schreiben solle. Habe ich getan und auch die Form1 gelöscht und nur noch die Unit1 im Programm intergriert. Allerdings bekommt das Proggi beim Ausführen trotzdem kurz den Fokus und beeinträchtigt damit die Arbeit in anderen Programmen.

Habt ihr nen Tipp, was ich noch machen kann?
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Sa 20.09.03 10:34 
sofern >WinNT Dienst implementieren. Geht mit D ganz easy.
grez
msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
Hendrik Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324



BeitragVerfasst: Sa 20.09.03 23:40 
Hey!


Könntest du das bitte etwas verständlicher sagen? Daraus werde ich nicht so wirklich schlau..
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: So 21.09.03 09:59 
Wenn Du ein "Programm" schreiben möchtest was im Background Aufgaben durchführt, OHNE das der Anwender was bemerkt, ist es am einfachsten, einen Dienst (TService) zu schreiben sofern du Windows NT, Prox, XP benutzt. Unter W9x gibts ja keine Dienste als solches.
Schau dir mal in OH TService an.
grez
msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
Hendrik Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324



BeitragVerfasst: So 28.09.03 19:34 
Hi!

Nochmal zu dem Thema : Als zusätzliches Problem habe ich, dass das Programm von einem anderen so gestartet wird, dass es den Fokus bekommt. Wie kann ich das trotzdem verhindern? Ich bin da immer noch nicht weiter gekommen?
gfroh
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 29.09.03 08:07 
Zitat:
[...] Als zusätzliches Problem habe ich, dass das Programm von einem anderen so gestartet wird, dass es den Fokus bekommt. Wie kann ich das trotzdem verhindern? [...]

Meinst Du starten wie mit WinExec(>CMDLine>,<WindowsStyle>)?
Da musst Du mal in der MS-SDK schauen bzgl. der möglichen Windows Styls (wenn ich mich nicht irre findet man das bei ShowWindow())
Ich glaube SW_SHOWMINNOACTIVE könnte das machen...
Hendrik Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324



BeitragVerfasst: Mo 29.09.03 21:02 
Hi!

Ich hab es damit mal probiert. Das Programm erhält trotzdem ganz kurz den Fokus und taucht auch kurz in der Taskleiste auf. Das ist aber sehr schlecht... Was kann ich denn noch machen, um das zu verhindern?
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mo 29.09.03 21:04 
SW_HIDE?
Soweit ich weiß wird dann nichts angezeigt.
Hendrik Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324



BeitragVerfasst: Mo 29.09.03 21:06 
Hi!


Auch schon versucht... Ohne Erfolg...

Hätte nie gedacht, dass das son Akt wird... *kopfkratz*
gfroh
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 30.09.03 08:52 
Was meinst Du eigentlich genau mit Focus bekommen? Das es auf dem Bildschim aufpopt?
In der Hauptunit (.DBR) zu Beginn ShowMainForm wie unten einfügen, dann sollte es garnicht mehr auftauchen... 8)
ausblenden Quelltext
1:
2:
3:
4:
begin
  Application.ShowMainForm:=false;
  Application.Initialize;
  ...

Gruß,
gfroh
Hendrik Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324



BeitragVerfasst: Di 30.09.03 14:49 
Hi!


Mit Fokus meine ich, dass die Titelleiste von meinem Proggi aktiv wird und die vom bisher geöffneten deaktiviert wird. Im Mom sieht es so aus, dass mein Proggi nen Bruchteil einer Sekunde den Fokus hat, aber das reicht schon um beim Arbeiten am PC zu stören...

Das Showmainform habe ich auch schon eingebaut, ohne erfolg..
svebor
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 30.09.03 15:09 
Also ist das Form sichtbar? Dann umgehst Du SW_Hide, ShowMainForm,, etc. Es bekommt den Fokus nur, wenn der Prozess von diesem Fenster ausgeht und sich dabei aktiviert. Da ich nicht weiss wie Dein Programm aussieht, was es macht, und warum es sichtbar sein muss und Dein Problem schon sehr speziell scheint, und ich auch kein Helseher bin: mit Tricks arbeiten... schon mal ohne Titelleiste versucht? kurz vorher verstecken und wieder nicht-aktiv dananch anzeigen(aber dann hats wohl auch schon Fokus gehabt)? Ich verstehe nicht, warum es überhaupt von Windows den Fokus zugewiesen bekommt.
Hendrik Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324



BeitragVerfasst: Di 30.09.03 15:23 
Hi!


Also um alles nochmal genau zu beschreiben :
Das Programm wird von einem anderen Programm (nicht von mir geschrieben) als Aktion gestartet und übergibt Parameter an das Proggi. Dieses sendet dann eine Windowsmessage an mein Hauptproggi. Da das Senden auch während des Arbeitens mit meinem Hauptproggi passiert ist das z.Z. ziemlich lästig, da das Hauptproggi dann den Fokus verliert...

Vielleicht könnt ihr mir aber auch nochmal Tipps geben, so dass ich das Proggi nochmal komplett neu schreibe..
svebor
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 30.09.03 18:07 
Also wenn ich es richtig verstehe folgender Ablauf:

A startet B - B gibt Daten zurück an A - A sendet Daten weiter an C.

Dabei verliert C zeitweilig den Fokus, wodurch Du selbst beim Arbeiten mit C unterbrochen wirst. 8)

Tja. Irgendwo in A oder B bekommt B speziell den Fokus zugewiesen, sonst würde dieser nicht wechseln - jedenfalls sollte es normal nicht passieren. *mitdenschulternzuck*
Ich schätze es ist A, der das beim Starten von B durch z.B. WinExec(PChar('B.exe'),SW_ShowNormal) macht. Wie bereits erwähnt, sollte man hier ein Parameter wie SW_SHOWMINNOACTIVE oder SW_SHOWNOACTIVE benutzen, so das das gestartete Programm dem gerade aktiven den Fokus nicht stehlen kann. :roll:
Also: A neu schreiben... (oder mit demjenigen reden, der es programmiert hat) :wink:
Hendrik Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324



BeitragVerfasst: Di 30.09.03 19:33 
Hi!


Also es ist so, dass A das Proggi mit SW__NORMAL ausführt. Das Programm kann ich nicht verändern....

Das würde dann mit anderen Worten heißen, dass es null Chancen gibt zu verhindern, dass B den Fokus erhält?
svebor
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 30.09.03 23:30 
Jupp, scheint so. Mußt wohl A neu schreiben... (oder wenn Du damit umgehen kannst, mit einem HEX-Editor verändern) :wink: