Einzelnen Beitrag anzeigen

Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#30

AW: Projektpfad in der IDE-Titelzeile anzeigen?

  Alt 1. Jul 2018, 12:56
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:
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;
Je mehr Input Du AddSList() übermittelst um so feiner wird es aber es bezieht auch gleich immer mehr Ergebnisse mit ein.
Du wirst sehen was ich meine sobald du mal if ((AddSList(Msg.hwnd, Msg.message, Msg.lParam, Msg.wParam, True, True)) and (SList.Count > 0)) then aufrufst.
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!
Angehängte Dateien
Dateityp: 7z ShowPath_Hook.7z (4,3 KB, 1x aufgerufen)
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat