Rysowanie po obcym oknie

0

Mógł by mi ktoś powiedzieć jak rysować (lub załadować) obrazek do innego okna (przez Hooka) tak jak np zmienia się nazwę programu:

var
  hW : HWND;
begin
  hW := FindWindow(nil, 'Mozilla Firefox'); // określ uchwyt
  SetWindowText(hW, 'Hacked Firefix');
end;

próbowałem ogarnąć coś z rozdziału 12 Rozdział 12
ale jedyne co mi wychodziło to dodanie buttonu itp Ładowanie i wyświetlanie bitmapy już mi nie działało...

0

Musisz znaleźć uchwyt do tego okna np. funkcją FindWindow, albo np. EnumWindows (sposobów jest dużo), po czym funkcją GetDC uzyskać HDC. Mając HDC jesteś już na dobrej drodze, bo możesz go bezpośrednio używać w GDI czy GDI+ :) ... aha Tylko że to co pokazałeś w przykładzie, to nie hook. Mój opis także jest bez hooka ...

0

No to mam coś takiego:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellAPI;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  PS : TPaintStruct;
  DC  : HDC; // uchwyt

implementation

{$R *.dfm}
{$R BITMAP.RES}

function WndProc(Wnd: HWND; uMsg: UINT; wPar: WPARAM; lPar: LPARAM): LRESULT; stdcall;
var
  Bitmap : HBITMAP;
  _Bitmap : HDC;
begin
{ na początek zwracamy wartość 0 - meldunek jest przetwarzany }
  Result := 0;
  case uMsg of
   { tutaj, w tym miejscu należy obsłużyć należne komunikaty }
   { w funkcji DefWindowProc przekazujemy takie same parametry jak w funkcji okienkowej }
    WM_PAINT:
    begin
      DC := BeginPaint(Wnd, PS);

      Bitmap := LoadBitmap(hInstance, 'ID_BITMAP');
      _Bitmap := CreateCompatibleDC(DC);
      SelectObject(_Bitmap, Bitmap);
      BitBlt(dc, 10, 10, 14, 14, _Bitmap, 0, 0, SRCCOPY);
      DeleteDC(_Bitmap);

      EndPaint(Wnd, PS);

    end;

    WM_DESTROY: PostQuitMessage(0);
    else Result := DefWindowProc(Wnd, uMsg, wPar, lPar);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  hW : HWND;

begin
  hW := FindWindow(nil,'Form1'); // określ uchwyt
  DC:=GetDC(hW);
WndProc(hW,DC,10,10);
end;

end.

i w debuggerze pisze że

[Error] Unit1.pas(69): Types of actual and formal var parameters must be identical
 

nie może skompilować bo parametr musi być taki sam i nie wiem o co chodzi...

1 użytkowników online, w tym zalogowanych: 0, gości: 1