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 Hook Frage (https://www.delphipraxis.net/92287-hook-frage.html)

core 17. Mai 2007 13:26


Hook Frage
 
Hallo!

Habe diese Frage schon in einem anderen Thread gestellt, möchte aber gerne einen eigenen erstellen, da ich zu diesem Thema nicht viel in Foren gefunden habe.

Ist es eigentlich möglich, über einen Hook ein neues Fenster, oder ein zusätzliches Ausgabefeld in einer fremden Anwendung zu erstellen? Sozusagen die fremde Form zu erweitern. Wie erweitert z.B. dieses Tool EazyFolder den standard Öffnen- und Speicherndialog??

mfg

SirThornberry 17. Mai 2007 13:31

Re: Hook Frage
 
ja, es ist möglich. Dafür wird einfach der Funktionaufruf abgefangen welcher den Dialog erstellt und es werden bestimmte aufrufparameter angepasst etc.
Das erweitern funktioniert dann gleichermaßen wie es auch in eigenen Anwendungen funktioniert.

core 17. Mai 2007 14:48

Re: Hook Frage
 
Wenn ich jetzt z.B. GetOpenFileNameA Hooke funktioniert das auch:

Delphi-Quellcode:
{...}
function GetOpenFileNameACallback(var OpenFile: TOpenFilenameA): Bool; stdcall;
begin
  result := GetOpenFileNameANext(OpenFile);
  MessageBoxA(0, 'Test', '', 0);
end;
{...}
Aber ich komm jetzt nicht drauf, wie ich etwas in dem Dialog selbst ändern könnte und darauf dann Zugriff hätte???

core 17. Mai 2007 15:21

Re: Hook Frage
 
Das funktioniert auch soweit:

Delphi-Quellcode:
{...}
function GetOpenFileNameACallback(var OpenFile: TOpenFilenameA): Bool; stdcall;
var
  test: hwnd;
begin
  OpenFile.lpstrFilter := PChar('Alle Dateien|*.*');
  result := GetOpenFileNameANext(OpenFile);

  test := OpenFile.hWndOwner;
  MessageBoxA(0, Pchar(IntToStr(test)), 'Hooked...', 0);
end;
{...}
Ich hab jetzt in allen Dialogen zum Test den Filter auf "Alle Dateien|*.*" gesetzt. Ich müsste ja nun an dieser Stelle den aufgerufenen GetOpenFileNameA Dialog mit meinem ersetzen, nur wie ... :gruebel:

core 17. Mai 2007 15:40

Re: Hook Frage
 
Mein nächster Ansatz wäre folgender gewesen:

Delphi-Quellcode:
{...}
function GetOpenFileNameACallback(var OpenFile: TOpenFilenameA): Bool; stdcall;
var
  test: hwnd;
begin
  OpenFile.lpstrFilter := PChar('Alle Dateien|*.*');
  result := GetOpenFileNameANext(OpenFile);

  test := OpenFile.hWndOwner;
  MessageBoxA(0, Pchar(IntToStr(test)), 'Hooked...', 0);
 
  //neu
  wc.hInstance := OpenFile.hInstance;
  wc.hbrBackground := GetSysColorBrush(COLOR_3DFACE);
  wc.hCursor := LoadCursor(0, IDC_ARROW);

  RegisterClassEx(wc);

  CreateWindowEx(WS_EX_TOOLWINDOW,
    ClassName,
    AppName,
    WS_CAPTION or WS_VISIBLE or WS_SYSMENU or WS_MINIMIZEBOX,
    Integer(CW_USEDEFAULT),
    Integer(CW_USEDEFAULT),
    WindowWidth,
    WindowHeight,
    0,
    0,
    hInstance,
    nil);

  SetForegroundWindow(nhwnd);
end;
{...}
Also mit TWndClass eine eigene Fensterklasse erzeugen (Rest ist in einer zweiten Unit abgelegt) und
wc.hInstance von OpenFile.hInstance nehmen. Aber das ganze funktioniert so überhaupt nicht...

core 17. Mai 2007 16:39

Re: Hook Frage
 
Und weiter gehts :shock:

Delphi-Quellcode:
function GetOpenFileNameACallback(var OpenFile: TOpenFilenameA): Bool; stdcall;
begin
  result := true;

  OpenFile.lpstrFile := pchar('C:\test.txt');
end;
Bei dieser Variante wird der OpenDialog nicht mehr aufgerufen und der Dateiname immer auf "C:\test.txt" gesetzt. Ich müsste jetzt wissen, wie ich nach dem "result := true" eine eigene Form erzeuge. Den neuen Dateinamen von meiner Form könnte ich dann ja an "OpenFile.lpstrFile" übergeben.
Von OpenFile bekomme ich ja auch den "hwndOwner" und die "hinstance"... :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07: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