![]() |
AW: Projektpfad in der IDE-Titelzeile anzeigen?
Zitat:
Ich spiele noch ein wenig mit AllocWnd()/AllocateHWnd() herum, vielleicht passt da ne hook rein die Delphi nix böses antut. Falls ich da Erfolg haben sollte sag ich hier bescheid, hier ist sonst Endstation für mich und TE hat Pech:oops: |
AW: Projektpfad in der IDE-Titelzeile anzeigen?
Zitat:
Zitat:
|
AW: Projektpfad in der IDE-Titelzeile anzeigen?
Zitat:
|
AW: Projektpfad in der IDE-Titelzeile anzeigen?
Zitat:
TApplication.HookMainWindow? |
AW: Projektpfad in der IDE-Titelzeile anzeigen?
Liste der Anhänge anzeigen (Anzahl: 2)
Hier ein mini Update für Messages, nun haben die Ihren Eigenen Reiter (Tab).
Jetzt werden keine Messages mehr durcheinander gewürfelt, und falls Messages nicht sichtbar sind schaltet die das Plugin an. Vorschau:Anhang 49417 |
AW: Projektpfad in der IDE-Titelzeile anzeigen?
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ist eine NICHT funktionierende Version mit Deinem Hook Vorschlag.
Es funktioniert NICHT oder ich mache es falsch. Den Hook habe ich ausgeschaltet damit die IDE heile bleibt.
Delphi-Quellcode:
die // Zeichen entfernen damit der Hook wirksam wird.
constructor TShowPath.Create;
begin inherited Create; // Application.HookMainWindow(MessageHook); // Application.OnMessage := AppMessage; // fHWnd := AllocateHWnd(WndMethod); end; destructor TShowPath.Destroy; begin // Application.UnhookMainWindow(MessageHook); // DeallocateHWnd(fHWnd); inherited Destroy; end;
Delphi-Quellcode:
Das sind die eigentliche Hooks, funktioniert so nicht oder ich habe da gänzlich was falsch gemacht.
function TShowPath.MessageHook(var Msg: TMessage): Boolean;
begin Result := False; if (Msg.Msg = WM_SETTEXT) then begin (BorlandIDEServices as IOTAMessageServices).AddTitleMessage( 'WM_SETTEXT', MyGroup); if ((NewTitle <> '') and (NewTitle <> Application.MainForm.Caption)) then Application.MainForm.Caption := NewTitle; Msg.Result := 0; Result := True; end; end; procedure TShowPath.AppMessage(var Msg: TMsg; var Handled: Boolean); begin Handled := False; if (Msg.Message = WM_SETTEXT) then begin (BorlandIDEServices as IOTAMessageServices).AddTitleMessage( 'WM_SETTEXT', MyGroup); if ((NewTitle <> '') and (NewTitle <> Application.MainForm.Caption)) then Application.MainForm.Caption := NewTitle; Msg.message := 0; Handled := True; end; end; procedure TShowPath.WndMethod(var Msg : TMessage); var Handled: Boolean; begin Handled := True; case Msg.Msg of WM_SETTEXT: if ((NewTitle <> '') and (NewTitle <> Application.MainForm.Caption)) then Application.MainForm.Caption := NewTitle; else Handled := False; end; if Handled then Msg.Result := 0 else Msg.Result := DefWindowProc(fHWnd, Msg.Msg, Msg.WParam, Msg.LParam); end; Ps: In dieser Version habe ich die Messages ein klein wenig verändert, nun werden Sie nicht mehr in den Vordergrund forciert. Ich bin mit meinem Latein am Ende. edit Dieser Anhang ist nur für experimentier freudige! Habe den Anhang aktualisiert mit drei Hook Varianten, alle sind ausgeklammert beim kompilieren da es nicht das gewünschte Resultat bietet. Die Timer Methode kann man im initialization & finalization anschalten. Mehr Hook Methoden fallen mir wirklich nicht mehr ein. Wie Uwe sagte, es klappt so nicht da dafür keine Notification existiert. |
AW: Projektpfad in der IDE-Titelzeile anzeigen?
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ist eine Version die tatsächlich die Titelzeile (leider flackernd) up-to-date hält.
Das ist praktisch das gleiche wie oben nur total radikal da bei jeder Msg die Caption ein Update erhält sofern die nicht den Inhalt der letzten Datei entspricht. Ich empfehle es nicht zu benutzen, Source kannst Du ja nach belieben noch verbessern/verschlimmern :lol: Man sieht mehr den Pfad+Namen als das was Delphi da reinschreiben will, also es macht schon irgendwie das was Du in Post #1 wolltest. Aber irgendwo ist der Wurm drinnen, wenn man Delphi beenden will stürzt Delphi ab. Also da musst Du mithelfen den Fehler zu lokalisieren, ich entdecke ihn nicht :pale: Nachtrag: Dank dieses Projekts ist mir was aufgefallen was ich so vorher auch noch nicht wusste. Die HookMainWindow Methode wird ausgelöst nachdem Delphi Messages verarbeitet hat. Die OnMessage Methode wird ausgelöst bevor Delphi Messages verarbeitet. Die AllocateHWnd Methode funktioniert gar nicht, ob nur in diesem Kontext oder generell ist ungewiss, bei Forms klappt es meist. Also wenn man bei OnMessage das richtige Ereignis abfängt sollte es immer das machen was Du möchtest ohne das momentane geflackere. Damit wäre auch der Delphi beenden bug eleminiert. |
AW: Projektpfad in der IDE-Titelzeile anzeigen?
*entfernt, Beitrag war schädlich/gefährlich*
|
AW: Projektpfad in der IDE-Titelzeile anzeigen?
Die Caption bei jedem Aufruf von TShowPath.MessageHook zu ändern ist natürlich keine Option.
Die Filterung nach WM_SETTEXT in TShowPath.MessageHook ist letztlich unwirksam, weil die IDE das nach kurzer Zeit wieder überschreibt. Eine Möglichkeit, die man noch probieren könnte, wäre das Senden einer USER-MESSAGE entweder in TShowPath.FileNotification, oder in TShowPath.MessageHook bei WM_SETTEXT. Aber das würde ein dauerndes Überschreiben erzeugen, zwar nicht so stark flackernd wie beim ungefilterten TShowPath.MessageHook, aber es wäre - um eine Metapher zu verwenden - wie ein ständiges Aufwischen ständig verschütteter Milch. Besser wäre es, es gar nicht erst so weit kommen zu lassen, dass überhaupt Milch verschüttet wird. Das eigentliche "Problem" ist ja, dass die IDE selbst nur den Projektnamen in die Titelzeile schreibt anstatt den ganzen Pfad des Projektes. Ich weiß nicht, ob es möglich ist, den Code der IDE so zu patchen, dass einfach statt des Projektnamens der ganze Pfad geschrieben wird. Das wäre die sauberste Lösung. Am einfachsten wäre es natürlich, wenn man den Code der IDE zur Verfügung hätte. Embarcadero müsste ausschließlich den UI-Teil der IDE als Open Source zur Verfügung stellen, die man nach eigenem Belieben anpassen kann. Wenn Embarcadero gescheit wäre, würden sie das tun. Denn das Ziel sollte es sein, die Weiterentwicklung der IDE AUF EINE BREITERE BASIS ZU STELLEN, um die IDE aus der Steinzeit in die Moderne zu führen. --- PS: Das Crashen beim Beenden der IDE kommt offenbar daher, dass wegen der hohen Aufruf-Häufigkeit von TShowPath.MessageHook versucht wird, Methoden von TShowPath auszuführen wenn IDE-Objekte schon nicht mehr existieren. |
AW: Projektpfad in der IDE-Titelzeile anzeigen?
Liste der Anhänge anzeigen (Anzahl: 1)
Das was Du möchtest funktioniert nicht. Ich habe gestern Nacht noch ein wenig herum-experimentiert um herauszufinden ob man mit der OnMessage Methode ein passendes Ereignis abfangen, auswerten und verarbeiten kann = Nein man kann nicht bzw ich habe dabei die Geduld verloren.
Bei Interesse, im Anhang ist die OnMessage Variante die gleichzeitig einen neuen Message-Reiter "MyHook" einrichtet. Hier ist das Herz-Stück davon:
Delphi-Quellcode:
Je mehr Input Du AddSList() übermittelst um so feiner wird es aber es bezieht auch gleich immer mehr Ergebnisse mit ein.
procedure TShowPath.AppMessage(var Msg: TMsg; var Handled: Boolean);
var ClassName, WindowName: String; begin Handled := False; // Hier ist ein Beispiel wie man sich auf eine Message von einer bestimmten Resource festlegt { SetLength(ClassName, 64); SetLength(ClassName, GetClassName(Msg.hwnd, PWideChar(ClassName), 64)); SetLength(WindowName, 64); SetLength(WindowName, SendMessage(Msg.hwnd, WM_GETTEXT, 64, lParam(PChar(WindowName)))); if ((Msg.message = 275) and (ClassName = 'TPUtilWindow')) then begin if ((NewTitle <> '') and (NewTitle <> Application.MainForm.Caption)) then Application.MainForm.Caption := NewTitle; // Handled := True; // <- AUF GAR KEINEN FALL TRUE ÜBERGEBEN WENN NICHT ZU 1000% SICHER!!!! // Exit; // Das hier aktivieren um Eintrag in die StringList zu unterdrücken end; } // if Msg.hwnd = Application.Handle then // So grenzt man das ganze auf seine Eigene Applikation ein, in diesem Falle falsch. if ((NewTitle <> '') and (NewTitle <> Application.MainForm.Caption)) then begin // Hier wird die Caption neu betitelt und gleich danach wieder von Delphi oder WinApi überschrieben Application.MainForm.Caption := NewTitle; try finally // Wenn man sich auf einen Window/ClassName geeinigt hat kann man auch die Params mit einbeziehen was zu deutlich mehr Ergebnissen führt // aber wenn man es Perfekt haben will, kann man nur so sich tiefer und tiefer reinbuddeln bis man am Ziel ist. // dafür existiert ein weiterer Boolean bei der Übergabe // Anmerkung: hier sieht man auch wie man auf die aktuelle Msg reagiert und nicht die Last-Variablen // if ((AddSList(Msg.hwnd, Msg.message, Msg.lParam, Msg.wParam, True, True)) and (SList.Count > 0)) then // Hier ein Beispiel mit den Last-Variablen // if ((AddSList(LastH, LastM, LastL, LastW, True)) and (SList.Count > 0)) then // Der minimalste Aufruf von AddSList() der auch noch Sinn erfüllt sieht so aus: if ((AddSList(Msg.hwnd, Msg.message)) and (SList.Count > 0)) then begin (BorlandIDEServices as IOTAMessageServices).AddTitleMessage( 'AppMessage @ '+SList.Strings[SList.Count-1], HookGroup); // Handled := True; // <- AUF GAR KEINEN FALL TRUE ÜBERGEBEN WENN NICHT ZU 1000% SICHER!!!! end; end; end; end; Du wirst sehen was ich meine sobald du mal
Delphi-Quellcode:
aufrufst.
if ((AddSList(Msg.hwnd, Msg.message, Msg.lParam, Msg.wParam, True, True)) and (SList.Count > 0)) then
Die AddSList() sollte lieber die ganze TMsg mitgeliefert bekommen, wäre einfacher, mir war es in dem Moment egal. Kannst Du ja gerne korrigieren. Ich mache an diesem Punkt damit nicht weiter, Nadel im Heuhaufen findet man schneller als das Ereignis was für die Caption verantwortlich ist. Ich wünsche Dir auf jeden Fall viel Glück bei dem Vorhaben! Meine Vermutung ist das es schlicht nicht möglich ist das generisch so hinzubekommen das es auf jedem Rechner mit jeder Delphi Version gleich funktioniert. Du kannst natürlich auch alles was Du selber vorschlägst durchprobieren, ich gehe da auch von einem Scheitern aus. Ich bin gespannt ob Du da was hinbekommst!:thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:46 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-2025 by Thomas Breitkreuz