Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Befehl immer wieder ausführen ohne CPU belastung (https://www.delphipraxis.net/152605-befehl-immer-wieder-ausfuehren-ohne-cpu-belastung.html)

lbccaleb 5. Jul 2010 10:29

AW: Befehl immer wieder ausführen ohne CPU belastung
 
Also es geht um Flightsimulator X, hast du zu selbigen mal die 2 Service Packs ausprobiert? Das währe auf jedenfall ne bessere Lösung als das irgend ein selbstgeschriebenes Programm erledigen zu lassen ;)

BlueLiquidCell 5. Jul 2010 10:35

AW: Befehl immer wieder ausführen ohne CPU belastung
 
Hey
Ja klar hab ich gemacht, bringt leider nix. Auch in Foren zum FSX gibt es nirgens eine Lösung deswegen wollte ich halt selber probieren.
Christoph

PS: Sorry wegen dem andern Thread, kenn mich hier noch net so aus ;-)

Hier nochmal das Problem:

Es geht um nen Flugsimulator. Das Problem dort ist, wenn man ihn im Fenstermodus laufen lässt (was für meine Anwendung nicht anders geht) dann geht der Sound sofort weg wenn man wo anders hinklickt, deshalb wollte ich halt etwas haben was ihn im Vordergrund hält oder bzw dann sofort wieder zurück bringt wenn man wo anders hingeklickt hat.
Mit Deskpins geht leider nicht, das Fenster bleibt zwar im Vordergrund aber leider nicht aktiv -> Sound geht aus
Und ich wollt das halt mit einem Button aktivieren und mit nem anderen abbrechen.
Habs jetzt so gemacht:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
    fHandle, fHandle2: HWND;
begin
    fHandle := FindWindow('fs98main', nil);
    if (fHandle <> 0) then
    begin
       BringWindowToTop(fHandle);
       SetForeGroundWindow(fHandle);
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled:=False;
end;
Problem 1:
Wenn der Timer auf 50ms oder 100ms gestellt ist muss man schon öfter die Abbrechen Taste drücken bis der befehl durchkommt.

Problem 2:
Wenn Ich das Programm unter Delphi teste funktioniert es immer.
Wenn ich es allerdings alleine (nur die .exe) starte, bringt es den Flugsimulator auch in den Vordergrund wenn ich aber danach ein Windows fenster anklicke funktioniert es anscheinend nicht mehr. Der Flugsimulator blinkt zwar unter in der Taskleiste kommt aber nicht in den Vordergrund.

Vlt geht das mit dem Sound ja auch anders???? Man Kann im Flugsimulator die Sound-Device ID einstellen. Kann man vlt ein Neues Device erstellen was den Sound immer weitergibt an das richtige Device?

Danke schonmal für die Antworten

Christoph

Mschmidt 5. Jul 2010 16:32

AW: Befehl immer wieder ausführen ohne CPU belastung
 
versuchs mal mit dem reagieren auf die Windows-Botschaft WM_NCACTIVATE().
:-mschmidt

Aphton 5. Jul 2010 17:58

AW: Befehl immer wieder ausführen ohne CPU belastung
 
Zitat:

Zitat von himitsu (Beitrag 1032330)
PS: Warum ein rießiger Integer i, wo dieser doch nur wie ein Boolean verwendet wird?

Ein Boolean ist auch nicht gerade "winzig" ... ist immerhin 1/4 x so groß wie ein Integer :P

himitsu 5. Jul 2010 18:47

AW: Befehl immer wieder ausführen ohne CPU belastung
 
Standardmäßig bietet er aber "logisch" gesehn genau die 2 nötigen Zustände.

BlueLiquidCell 5. Jul 2010 20:37

AW: Befehl immer wieder ausführen ohne CPU belastung
 
MSchmidt - WM_NCACTIVATE()

Hab das mit dem WM_NCACTIVATE() mal ausprobiert. Wie das bei meiner eigenen Form funktioniert ist klar aber wie kann ich das denn allgemein überwachen, welches Programm grade diesen Befehl bekommt.

Christoph

rollstuhlfahrer 5. Jul 2010 23:10

AW: Befehl immer wieder ausführen ohne CPU belastung
 
Ich würde mal sagen, da du ja das Fensterhandle von deinem Prozess hast, kannst du auch an das die Nachricht schicken (Send-/PostMessage). Als Parameter solltest du für wParam ein TRUE und für lParam ein -1 nehmen. Laut MSDN sagt das dann dem Fenster, es soll sich eine aktive Titelleiste zulegen, auch wenn diese dann nicht gezeichnet wird.

Bernhard

BlueLiquidCell 6. Jul 2010 13:34

AW: Befehl immer wieder ausführen ohne CPU belastung
 
Ja das könnte ich machen, aber das Problem war ja primär zu wissen wann es auf nicht aktiv gesetzt wird um dann was dagegen zu tun. Momentan mach ich das halt alle 100ms oder so, und das is ja nicht so das wahre.
Oder hab ich dich jetzt falsch verstanden?
Christoph

BlueLiquidCell 7. Jul 2010 10:51

AW: Befehl immer wieder ausführen ohne CPU belastung
 
Also hab das WM_NCACTIVATE ausprobiert. Mit Notepad funktionierts. Bin momentan nicht an meinem anderen Rechner, deswegen kann ich das mitm sound grad nicht ausprobieren.
Das mit dem lParam hab ich allerdings noch nicht so ganz verstanden. Hab Einstellung 1, 0, -1 ausprobiert und nicht wirklich einen unterschied gemerkt.
Zur Aktivierung die Aktion ausgeführt wird hab ich mir überlegt, dass man ja nach jedem Mausklick ein bisschen wartet und es dann ausführt. Gibt es eine Möglichkeit den Mousklick auf dem gesamten Desktop zu überwachen? Oder geht das nur innerhalb der Form?
Christoph

rollstuhlfahrer 7. Jul 2010 12:19

AW: Befehl immer wieder ausführen ohne CPU belastung
 
Du kannst alle Mausklicks durch einen Hook überwachen. Wenn dann einer dabei ist, der außerhalb deines Fensters ist, kannst du ihn entweder blocken oder einen in das Fenster nachsetzen.

Bernhard


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:48 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz