Window subclassing w Delphi

Window subclassing w Delphi
MacMarian
  • Rejestracja:prawie 18 lat
  • Ostatnio:ponad 11 lat
  • Postów:21
0

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:

Kopiuj
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

Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 13 lat
  • Postów:7923
0

- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
MacMarian
  • Rejestracja:prawie 18 lat
  • Ostatnio:ponad 11 lat
  • Postów:21
0
Misiekd napisał(a)

5 - Access is denied.

Fine, but why? :P

Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 13 lat
  • Postów:7923
0

- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.