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 Zeichnen auf Fremdes Panel (https://www.delphipraxis.net/108928-zeichnen-auf-fremdes-panel.html)

Black-Horse 21. Feb 2008 10:55


Zeichnen auf Fremdes Panel
 
Hallo,

ich möchte gerne in einer Fremden Applikation etwas zeichnen,
dafür habe ich mir nen Testprogramm geshcrieben das nur ein Panel beinhaltet und ich habe ein Programm geshcrieben, dass darin einen Kreis zeichnen soll.
Also ermittle ich mit Das Handle der Application und dachte mir, dass ich dann, wie auf dem desktop, zeichne, jedoch funktioniert das nicht, ich bekomme keine anzeige, wenn ich GetWindowDC(0) anstelle von GetWindowDc(WindowHandle) aufrufe zeichnet er auch korrekt auf meinem desktop.


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
 DCanvas: TCanvas;
 DHandle: HWND;
begin
  TheWindowHandle:=FindAWindow('Programmsize', '');
  if TheWindowHandle=0 then
    ShowMessage('Window not found!')
  else
  begin
    ShowWindow(TheWindowHandle, SW_SHOW);
    DHandle := GetWindowDC(TheWindowHandle);
    //DHandle := GetWindowDC(0);
    if DHandle<>0 then
    begin
     try
       DCanvas:=TCanvas.Create;
       try
         DCanvas.Handle:=DHandle;
         DCanvas.Font.Color:=clRed;
         DCanvas.Font.Size:=72;
         DCanvas.Brush.Style:=bsClear;
         DCanvas.TextOut(20, 20, 'Ein');
         DCanvas.Brush.Style := bsDiagCross;
         DCanvas.Ellipse(0, 0, 100, 100);



       finally
         DCanvas.Free;
       end;
      finally
        ReleaseDc(TheWindowHandle, DHandle)
      end;
    end
  end;
end;
Danke

gizzy 21. Feb 2008 11:01

Re: Zeichnen auf Fremdes Panel
 
Delphi-Quellcode:
TheWindowHandle:=FindWindow(nil, 'Programmsize');
Probier es mal damit

Black-Horse 21. Feb 2008 11:05

Re: Zeichnen auf Fremdes Panel
 
Findwindow liefert das gleiche Handlezurück wie ich es auch mit enumwindows herusgefunden hatte, das funktioniert leider auch nciht

Edit : ic hhätte vllt anmerken sollen, dass FindAWindow das Handle zurückliefert

Black-Horse 21. Feb 2008 13:52

Re: Zeichnen auf Fremdes Panel
 
Also es leigt wohl daran, das sich die falsche id an der hand habe, wenn ich mir die Threadid ausgeben lasse von meinem fenster und diese mit enumthreadwindows aufrufe komme ich an das handle und kann auch darauf malen, jedoch funktioniert die ermittlung mit GetWindowThreadProcessId(FindAWindow('Programmsize ', ''), @PID); nicht . ich bekomme eine flasche id zurück.

wie kann ich die threadid meines Programms ermitteln?

gizzy 21. Feb 2008 15:05

Re: Zeichnen auf Fremdes Panel
 
Wozu brauchst du die Prozess ID?
Ich kenne das nur zum Lesen oder schreiben innerhalb des speichers:

Delphi-Quellcode:
var
PID: Integer;
HandleWindow: Cardinal;
begin

HandleWindow := OpenProcess(PROCESS_VM_READ,False,PID);

{...}
Das Window Handle über deine FindAWindow Funktion sollte eigentlich reichen.

Luckie 21. Feb 2008 15:14

Re: Zeichnen auf Fremdes Panel
 
Du musst natürlich das Handle des Panels ermitteln, das des Parent-Fensters reicht nicht. Du musst also erst mit MSDN-Library durchsuchenFindWindow das Handle des Hauptfensters ermitteln und dann mit MSDN-Library durchsuchenFindWindowEx das Handle des Child-Fensters, hier des Panels.


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