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
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
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.
to jak by znaleźć uchwyt dla aplikacji która nie ma "ciała" tylko jest samym procesem ?
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)
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 ?
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.
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.
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
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?
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...
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.
no właśnie jaki?
Oj no jest ich trochę
http://pl.wikipedia.org/wiki/Komunikacja_mi%C4%99dzyprocesowa
Jakbyś opisał ogólny zamysł aplikacji to coś doradzę.
Ł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.
dobra dzięki za pomoc