Witam
Jak mozna odczytac kolor pixela za pomoca funkcji asemblera pod win xp ? [!!!]
Zależy, gdzie jest ten pixel i czemu w Delphi chcesz użyć specjalnie asemblera? Zysku szybkości przecież mieć nie będziesz specjalnego - o ile w ogóle będziesz miał zysk, a nie stratę (bo optymalizator nie będzie mógł wkroczyć do akcji).
Prawdopodobnie posługujesz się Canvas.Pixels i jest zbyt wolne.. Czy tak?
nie jest wolne ale program do ktorego to mi jest potrzebne blokuje niskie funkcje pobierania pixeli ...
Co rozumiesz przez "blokuje niskie funkcje pobierania pixeli" ? Przepraszam, ale to jakiś bełkot dla mnie..
nie wiem jak to inaczej wytlumaczyc wiem jedno stosujac Canvas.Pixels nie jestem wstanie odczytac piksela
A co się wykona? Pokaż kod, napisz z czego chcesz pikselka odczytać, napisz czym się objawia niedziałanie.
function DesktopColor(const X, Y: Integer): TColor;
var
c: TCanvas;
begin
c := TCanvas.Create;
try
c.Handle := GetWindowDC(GetDesktopWindow);
Result := GetPixel(c.Handle, X, Y);
finally
c.Free;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
Pos: TPoint;
begin
GetCursorPos(Pos);
Shape1.brush.Color:= DesktopColor(Pos.X, Pos.Y);
end;
odczytac chce z gry :P ale po na jechaniu kursorem na nia kolorek zmienia sie na czarny bez wzgledu gdzie jest kursor
Jeśli gra obsługuje overlay lub akcelerację sprzętową, to pobranie obrazu z "bitmapy pulpitu' nie da Ci nic, albo najwyżej zwróci kolor tła okna, w którym jest wyświetlany obraz. To taka sama sytuacja jak robienie printscreena z odtwarzanego filmu - jak idzie przez overlay to otrzymasz czarne okno.
dokladnie zwraca mi czarny kolor jest jakis sposob by to obejsc ?
Jest, ale nie należy on bynajmniej do łatwych (ani nawet średnich), jeśli chodzi o poziom trudności. Musiałbyś uzyskać dostęp do urządzenia renderującego w określonej aplikcji, a następnie wyrenderować określoną klatkę dla siebie. Innym rozwiązaniem jest wymuszenie na sterowniku wyłączenie trybu overlay (trudne i wiąże się z bardzo dużym spadkiem szybkości chodzenia gry), aby zrobić pobranie piksela metodą jak powyżej.
Podkreślam, jest to dosyć trudne zagadnienie - do tego stopnia, że niektóre komercyjne programy do zrzutów ekranu w postaci obrazków/filmów nie mają tej opcji.
Jeszcze innym rozwiązaniem jest systemowe wyłączenie wszelkiej akceleracji sprzętowej: Panel Sterowania -> Ekran -> Ustawienia -> Zaawansowane -> Rozwiązywanie problemów -> Przyspieszenie sprzętowe: Brak. Ale o jakiejkolwiek wydajności systemu możesz zapomnieć.
wiem ze jest to mozliwe ale niestety nie moge uzyskac kodu <ort>poza tym </ort>byl napisanyw c++
Gameguard blocks the low level function what is used to read pixel information. That one what Microsoft provided. What I did - is a little workaround. That is why I needed C++. Actually I do not use that function, I read screen memory a different way.
Good luck.
znalazlem takie male info na jednej ze stron :P o grze