Witam, dziś rozpocząłem poszukiwania informacji na temat przechwytywaniu komunikatów obcego okna/obcej aplikacji. Ponieważ nie znalazłem nic o subclassingu w delphi, wziąłem na "ruszta" pierwszy lepszy kod z sieci, napisany w C++ w celu przeniesienia tego na Object Pascal. Z samym przeniesieniem tego, większych problemów nie było. Natknąłem sie po drodze, jednak na inny problem, z którym to nie moge sobie poradzić.
Przejdźmy do początku:
Mój początkowy kod do pobierania adresu funkcji obsługi okna obcej aplikacji (w tym wypadku kalkulator) wygląda mniej więcej tak:
hApp:=FindWindow('SciCalc',nil);
if isWindow(hApp) then
begin
Log.Lines.Add('Handle to Calc`s Window found');
MWProc:=GetWindowLong(hApp, GWL_WNDPROC);
if MWProc<>0 then
begin
Log.Lines.Add('WNDPROC: '+IntToStr(MWProc)); //yeah! thats it ;)
end
else
begin
WPErr:=GetLastError;
Memo1.Lines.Add('Err: '+IntToStr(WPErr)); //bullshit...
end;
end
else
begin
Log.Lines.Add('Fool! Run this shit first!'); //user is a fuckwit
end;
Nie wspomniałem o co tu chodzi. Jak widać jest to kod nie kompletny (zawiera jedynie metode która pobiera adres obsługi okna wskazując na uchwyt okna kalkulatora. Kalkulator jest tu oczywiście przykładem, w późniejszym czasie planuje użyć tego do zupełnie innych celów ;)
Krótko o problemie:
Pierwszy krok (FindWindow) działa bez zarzutów (trudno żeby nie ;) )
Wszystko sypie się przy naszym MWProc. Jak dobrze wiemy że GetWindowLong powinna zwrócić wartość <>0, jednakże w moim przypadku zwraca właśnie zero! :( GetLastError zwróciło mi "5", nie znalazłem jednak co oznacza ten kod błędu.
Jakieś pomysły?
Z góry dziękuje i pozdrawiam
MacMarian