czy da się otrzymać uchwyt z funkcją FindWindow pustej klasy

0

Mam pytanko czy da się otrzymać uchwyt z funkcją FindWindow podając typ który jest "pustą" klasą
np

type TMojaKlasa = class
end;

czy musi być to obiekt typu np TForm

0

Musi to być TForm.
Szukając "dziecka" funkcją FindWindowEx musi ono być co najmniej TWinControl.

Dokładniej mówiąc szukając uchwytu przez FindWindow wystarczy, że klasa będzie co najmniej TWinControl, nie musi być TForm tyle że musi to być okno typu top-level czego bez uciekania się do WinAPI w Delhi nie zrobisz jeśli to nie TForm.

0

to jak by znaleźć uchwyt dla aplikacji która nie ma "ciała" tylko jest samym procesem ?

0

Przecież funkcja FindWindow i FindWindowEx służą do zwracają uchwyty okien (w wypadku drugiej funkcji okien potomnych) a class nie posiada uchwytu uchwyt posiadają kontrolki i okna a więc w Delphi dziedziczące po TWinControl a tak jak napisałeś oznacza to samo co .

type TMojaKlasa = class(TObject)
end; 

a więc dziedziczy tylko po TObject (czyli podstawowej klasie)

0

ale w programie jest tylko jeden typ TMojaKlasa
i jak mogę się do niego odwołać (uchwyt) bo już nie mam pomysłu...
żadnego komponentu nie ma na tym ani modułu Forms tylko Windows, Messages, SysUtils
nie wiem może jakiś inny sposób ?

0

Ale jaki uchwyt? FindWindow szuka uchwytu okna. Nie ma okna to i nie ma uchwytu. Może napisz co chcesz osiągnąć.

kAzek napisał(a)

uchwyt posiadają kontrolki i okna a więc w Delphi dziedziczące po TControl
Musi być TWinControl. TControl nie ma uchwytu, nie jest oknem. Dlatego np. nie da się buttona przesłonić zwykłym labelem.

0

nie wyjaśniłem, chciałem znaleźć uchwyt do programu więc uznałem że najlepiej będzie użyć jakiejś sobie klasy do znalezienia uchwytu żeby później wysłać do niej (aplikacji) wiadomość SendMessage albo PostMessage.
ale nie ma praktycznie nic (nie ma interfejsu) w sumie to nawet klasa nie jest potrzebna do działania.

0

To trzeba było tak od razu, że chcesz przesyłać komunikaty do aplikacji. Poczytaj o "message-only windows".
http://www.google.com/search?q=HWND_MESSAGE+delphi

0

To że nie ma widocznego okna to nie znaczy że go nie ma nie wiem dokładnie jak napisałeś ten program ale może jest TApplication?

0

Tapp... jest w Forms więc odpada

takie coś

var
  Wnd: TWndClass;  // klasa okna
  Msg: TMsg;
begin
  with Wnd do
  begin
    hInstance := hInstance; // uchwyt do zasobów
    lpszClassName := 'My1stApp'; // klasa
    hbrBackground := COLOR_WINDOW; // kolor tła
  end;

  RegisterClass(Wnd); // zarejestruj nowa klasę
  ShowMessage(IntToStr(FindWindow('My1stApp',nil)));

end.

zwraca mi 0 nie wiem czemu...

0

A tworzenie okna gdzie? Generalnie musisz napisać aplikację tak jak się o robi w czystym WinAPI: rejestracja klasy (RegisterClassEx), tworzenie okna (CreateWindowEx), obsługa komunikatów (GetMessage, DispatchMessage).

Alternatywnie zastosuj mechanizm komunikacji inny od komunikatów.

0

no właśnie jaki?

1

Oj no jest ich trochę
http://pl.wikipedia.org/wiki/Komunikacja_mi%C4%99dzyprocesowa
Jakbyś opisał ogólny zamysł aplikacji to coś doradzę.

1

Łap przykład prostego programu (samo okienko) w WinApi dzięki temu będziesz mógł obsługiwać komunikaty (jeżeli nie chcesz okna zawsze możesz je ukryć)

program Test;

uses
  Windows,
  Messages;

{$R *.res}


function WndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  result:= 0;
  case uMsg of
    //obsluga komunikatow
    WM_DESTROY:
        PostQuitMessage(0);
    else
      Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
  end;
end;

function TopXY(wDim, sDim:DWord):DWord;
begin
  sDim:= sDim div 2;
  wDim:= wDim div 2;
  result:= sDim - wDim;
end;

const
  MyClassName = 'NazwaKlasy';
  WndWidth = 300;
  WndHeight = 200;
var
  MyWndClass: TWndClassEx;
  hWnd: THandle;
  Msg: tagMsg;
  x, y: Integer;
begin
  x:= TopXY(WndWidth, GetSystemMetrics(SM_CXSCREEN));
  y:= TopXY(WndHeight, GetSystemMetrics(SM_CYSCREEN));
  ZeroMemory(@MyWndClass, SizeOf(MyWndClass));
  MyWndClass.cbSize:= SizeOf(MyWndClass);
  MyWndClass.style:= CS_HREDRAW or CS_VREDRAW;
  MyWndClass.lpfnWndProc:= @WndProc;
  MyWndClass.hInstance:= hInstance;
  MyWndClass.hbrBackground:= COLOR_BTNFACE+1;
  MyWndClass.lpszClassName:= MyClassName;
  if RegisterClassEx(MyWndClass) = 0 then
  begin
    MessageBox(0, 'Błąd podczas próby rejestracji klasy okna', 'Test', MB_ICONERROR);
    exit;
  end;
  hWnd:= CreateWindowEx(0, MyClassName, 'Test', WS_OVERLAPPED or WS_SYSMENU
    or WS_MINIMIZEBOX , x, y, WndWidth, WndHeight, 0, 0, hInstance, nil);
  ShowWindow(hWnd, SW_NORMAL);
  UpdateWindow(hWnd);
  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
  ExitProcess(Msg.wParam);
end.
0

dobra dzięki za pomoc

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