Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi wie würdest ihr es anstellen, Buttons in fremde Titelleisten (https://www.delphipraxis.net/76783-wie-wuerdest-ihr-es-anstellen-buttons-fremde-titelleisten.html)

stoxx 9. Sep 2006 20:42


wie würdest ihr es anstellen, Buttons in fremde Titelleisten
 
Liste der Anhänge anzeigen (Anzahl: 1)
wie würdest ihr es anstellen, Buttons in fremde Titelleisten zu integrieren.

dass es so wie im Anhang aussieht ?

ich wollte ein kleines Desktop Managment Programm schreiben, um in alle Titelleisten (von allen offenen Fenstern) einen Button nach links und rechts zu haben, die bewirken, dass das Fenster bei einer Mehrmonitorlösung auf den anderen Monitor geschoben werden.
So in etwa, wie das Beispiel aus meiner Software .. (Anhang)
Arbeite mit 3 Monitoren, und es würde die Handhabung ziemlich vereinfachen ..

Danke Euch !
Gruß stoxx

Cyberbob 9. Sep 2006 21:24

Re: wie würdest ihr es anstellen, Buttons in fremde Titellei
 
Versuch doch mal die Hilfe zu bemühen. Etwa mit den Schlagwörtern "Titelleiste, Button"

Du kannst allerdings auch einfach einen neuen Button ins Systemmenü einfügen.
Luckie hatte da mal was:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure WndProc(var msg: TMessage); override;
  end;

var
  Form1        : TForm1;

implementation

{$R *.dfm}

const
  MY_MENU_ID = 999;

procedure TForm1.Button1Click(Sender: TObject);
var
  hMenu       : THandle;
begin
  hMenu := GetSystemMenu(Handle, False);
  if hMenu <> 0 then
  begin
    if not DeleteMenu(hMenu, 6, MF_BYPOSITION) then
      ShowMessage(SysErrorMessage(GetLastError));
    DrawMenuBar(hMenu);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  hMenu       : THandle;
begin
  hMenu := GetSystemMenu(Handle, False);
  if hMenu <> 0 then
  begin
    if not InsertMenu(hMenu, 6, MF_BYPOSITION, MY_MENU_ID, 'Mein Menüitem') then
      ShowMessage(SysErrorMessage(GetLastError));
    DrawMenuBar(hMenu);
  end;
end;

procedure TForm1.WndProc(var msg: TMessage);
begin
  inherited;
  case msg.Msg of
    WM_SYSCOMMAND:
      begin
        if hiword(msg.WParam) = 0 then
        begin
          case loword(msg.WParam) of
            MY_MENU_ID: ShowMessage('Buuuh!');
          end;
        end;
      end;
  end;
end;

stoxx 9. Sep 2006 21:30

Re: wie würdest ihr es anstellen, Buttons in fremde Titellei
 
Zitat:

Versuch doch mal die Hilfe zu bemühen. Etwa mit den Schlagwörtern "Titelleiste, Button"

Du kannst allerdings auch einfach einen neuen Button ins Systemmenü einfügen.
Das habe ich schon gelöst ( übrigens mit der JVCL .. die bietet eine recht komfortable Lösung für diese Buttons) .. vom eingestellten Style angepasste Buttons.

Ich möchte den Button z.b. in den Internet Explorer haben, hast Du da Ideen dazu ?

Vielen Dank !

SirThornberry 9. Sep 2006 21:43

Re: wie würdest ihr es anstellen, Buttons in fremde Titellei
 
wenn du weißt wie du den button für die eigene anwendung hinn bekommst musst du das ganze nur noch per hook in andere anwendungen integrieren

Daniel B 9. Sep 2006 21:47

Re: wie würdest ihr es anstellen, Buttons in fremde Titellei
 
Vielleicht schaffst du es ja die Buttons nach links zu versetzen, mittlerweile nutzen mir zu viele Anwendungen die rechte Seite, nur doof das dann Buttons übereinander liegen.

stoxx 9. Sep 2006 21:55

Re: wie würdest ihr es anstellen, Buttons in fremde Titellei
 
Zitat:

musst du das ganze nur noch per hook in andere anwendungen integrieren
ja genau ! . . deswegen hab ich meine Frage ja auch in das API Forum gestellt ;-)

nur leider habe ich mit der Windows API bisher noch nicht so intensiv gearbeitet, dass ich mir einen Lösungsweg selber überlegen könnte !
Hättest Du einen im Kopf ?

Flocke 9. Sep 2006 23:37

Re: wie würdest ihr es anstellen, Buttons in fremde Titellei
 
Mein Ansatz wäre:

1. Packe die Funktionalität in eine DLL
2. Erzeuge einen globalen Hook (z.B. WH_MOUSE) mit einer Funktion, die ebenfalls in der DLL liegt -> deine DLL wird in jeden Prozess injeziert.
3. Beim Laden der DLL ermittle alle Hauptfenster des jeweiligen Prozesses und merke sie dir (EnumWindows / GetWindowThreadProcessId).
4. Hooke die Funktionen CreateWindow und CreateWindowEx, um neue Hauptfenster abzufangen (die ohne WS_CHILD).
5. Ein WM_DESTROY in der Fensterprozedur entfernt ein Fenster aus deiner Liste.

Diesen Fenstern musst du dann deine Buttons zuordnen.

Entweder erzeugst du ein kleines Panel mit den Buttons, das du dann zusammen mit dem Fenster verschiebst, oder du arbeitest ohne Fenster und behandelst die Meldungen WM_NCLBUTTONDOWN, WM_NCMOUSEMOVE, WM_NCLBUTTONUP und WM_NCPAINT selbst.

Olli 10. Sep 2006 09:28

Re: wie würdest ihr es anstellen, Buttons in fremde Titellei
 
Ich befürchte, daß du dabei nicht um einen Hook der entsprechenden Fensterfunktionen herumkommen wirst (es sei denn du verwendest API-Hooks statt Fenster-Hooks).

Mein (veraltetes) Tut hast du sicher schonmal überflogen, oder? Wenn du WH_CALLWNDPROC (global) benutzt, solltest du auf der sicheren Seite sein. Inwieweit das die Performance negativ beeinflußt kann ich nicht sagen, müßtest du testen. Denn logischerweise existieren auf einem normalen System eine Menge Fenster (und damit Fensterfunktionen). Vorzugsweise sollte deine Hookfunktion also hochoptimiert sein um alle Fälle auszuschließen wo es ohnehin unnötig ist einzugreifen (bspw. bestimmte Nachrichten).


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:09 Uhr.

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