![]() |
Message bei Programmaktivierung aus Taskbar
Hallo,
Zuerst der Hintergrund. ich habe mir ein Plugin-System gebaut, welches auf Basis normaler Exe-Files arbeitet. Damit umgehe ich alle Probleme die BPL und dll bringen und mache mich von der Programmiersprache unabhängig. Ich kann so eine Exe modal oder nicht modal zum aufrufenden Programm ablaufen lassen und in die Mainform des rufenden Programmes einbetten. Beispiel: In einem Projekt ist die gesamte Abrechnung für einen Kunden ein eigenes Projekt. Beim Start übergebe ich die Kundennummer, arbeite das Programm modal zum aufrufenden Programm ab und bekomme einen Return-Code zum Erfolg des Programmes zurück. Beispiel:
Delphi-Quellcode:
TaskStrt := Task.Init(Self, Self,'Teilnehmerabrechnung.exe',false); // Das Steuerobjekt für den Task
result := AutPlugin.Task.Startmodal(Self,TaskStrt,'R' + RID); freeandnil(TaskStrt); if result = -1 then Showmessage('Teilnehmer wurde nicht gefunden'); Innerhalb von AutPlugin.Task.Startmodal wartet die Routine auf das Ende des aufgerufenen Programms.
Delphi-Quellcode:
Das funktioniert recht gut.
procedure WaitFor(processHandle: THandle);
var Msg: TMsg; ret: DWORD; begin repeat ret := MsgWaitForMultipleObjects(1, { 1 handle to wait on } processHandle, False, INFINITE, QS_PAINT or QS_SENDMESSAGE ); if ret = WAIT_FAILED then Exit; if ret = (WAIT_OBJECT_0 + 1) then begin while PeekMessage(Msg, 0, WM_PAINT, WM_PAINT, PM_REMOVE) do //<__ Hier müste die Abfrage erfolgen DispatchMessage(Msg); end; until ret = WAIT_OBJECT_0; end; { Waitfor } Neben dem rufenden Programm erscheint das gestartete Programm in der Taskleiste. Hier habe ich jedoch einen kleinen unschönen Effekt. Wechsele ich über die Taskleiste in ein beliebiges anderes Programm und dann zurück in das gestartete Programm funktioniert alles wie gewollt. Aktiviere ich über die Taskleiste jedoch das aufrufende Programm, dann kommt dieses in den Vordergrund und verdeckt das aufgerufene Programm. Es verhält sich, als ob es abgestürzt wäre, da es ja modal auf ein anderes Programm wartet. Ich habe noch keine Message gefunden, um im rufenden Programm zu erkennen, das es über die Taskleiste aktiviert wurde. (Zumindest onactivate und onshow kommen nicht in den sichtbar werdenen Fenstern an.) Kann mir wer auf die Sprünge helfen wie ich mitbekomme, ob ein Programm über die Taskleiste wieder in den Vordergrund geholt wird. Das wäre die einfachste Lösung. Alternativ könnte ich in der Taskleiste das aufrufende Programm verstecken. Für einen Tip dankbar. Gruß Peter |
AW: Message bei Programmaktivierung aus Taskbar
Könnte es
![]() |
AW: Message bei Programmaktivierung aus Taskbar
Zitat:
Es kommt nur die Message wm_paint. Die ist in diesem Zusammenhang aber nicht eindeutig. Gruß Peter |
AW: Message bei Programmaktivierung aus Taskbar
an welcher Stelle versuchst du auf die Message zu reagieren? Versuchst du auf die Message an das Form zu reagieren oder versuchst du auf die Message an die eigentliche Application zu reagieren?
|
AW: Message bei Programmaktivierung aus Taskbar
Also ausblenden findest du
![]() Ansonnsten könntest du im Aufrufenden Programm einen Boolean einrichten, welcher True ist während du in der Warteschleife hängst. Und in der Message WM_Activate wertest du diesen wert aus und sorgst dafür, dass das Programm nur wieder aktiviert wird, wenn es nicht mehr in der Schleife hängt. PS. Das Problem sollte bei dir nicht nur in der Taskbar auftreten, sondern auch wenn das Fenster auf andereweise aktiviert wird z.b. über "Alt + Tab" oder im Taskmanager. Edit: Zusätzlich musst du das selbe wohl auch für "WA_CLICKACTIVE" machen. |
AW: Message bei Programmaktivierung aus Taskbar
Zitat:
In der eigentlichen Warteschleife aus dem oberen Eintrag kommt nur ein wm_paint beim Aktivieren des rufenden Programms. Entweder bleiben alle anderen Meldungen schon im Delphi hängen oder das Fenster zeichnet sich als einzige Reaktion nur neu. Den Focus kann es ja nicht bekommen, da es in einer "harten" Warteschleife hängt.
Delphi-Quellcode:
An lbccaleb
if ret = (WAIT_OBJECT_0 + 1) then
begin while PeekMessage(Msg, 0, WM_PAINT, WM_PAINT, PM_REMOVE) do begin if msg.Message = wm_Paint then messagebeep(1); <<<<<<<<<<<< DispatchMessage(Msg); end; Ja das Problem tritt auch bei anderen Aktivierungen auf (Taskmanager, Alt-Tab). Ich wollte nur das Problem nicht unnötig komplizieren. Gruß Peter |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz