Pobranie kolorów - jak ?

0

Witam.
Mam taki problem: Chcę pobrać kolor z aktualnego miejsca na ekranie (punktu). Jak to zrobić programowo ? Dokładniej chcę pobrać kolor np. z jakiegoś programu (punkt znajdujący się na nim). Program otwiera się zawsze w tym samym miejscu więc wymyśliłem żeby programowo został zczytany kolor z danego punktu na ektanie i pokazał jaka jest wartość koloru np. w hex-ie. Ale nie mam pojęcia jak to zrobić ? Może ktoś mi pomoże.

0

Zrzut ekranu do TBitmap, a następnie pobranie określonego piksela z TBitmap.Canvas.Pixels. Jak włożysz odrobine w wysiłku w przeszukanie strony to na pewno znajdziesz jak zrobic obie rzeczy.

0

bez sensu jest zrzucac ekran do bitmapy. szkoda i pamieci i szybkosci.
lepiej tak:

procedure TForm1.Timer1Timer(Sender: TObject);
var P:TPoint;
    C:TCanvas;
    Col:TColor;
begin
GetCursorPos(P);

C:=TCanvas.Create;
C.Handle:=GetWindowDC(GetDesktopWindow);
Col:=C.Pixels[p.x, p.y];
C.Free;

Form1.Color:=Col;
end;

pozdro.

0

Dzięki wielkie. Drugi sposób jest o niebo lepszy i prostszy ale pierwszy też spełnia zadanie. W każdym <ort>bąć </ort>razie problem rozwiązany.

0

No i mam problem z tym moim programem . Napisałem go na bazie kodu co dał cimak. Dodałem do niego układ sprawdzający czy punkt pobierany z danego miejsca jest takiego samego koloru jak kolor w pamięci i zapętliłem to wszystko poprzez Timer (program porównywania wykonywał się co 1 sekundę). Niestety jak ten programik uruchomiłem na windowsie 98 to po ok 30 min. windows mi się krzaczy i wyskakują komunikaty o braku pamięci ( tak jakby ten mój program "zjadał" pamięć). Na windowsie XP też po jakimś czasie wszystko się sypie i pokazuje się komunikat że canvas nie może czegoś zdobić (nie zapisałem go i piszę teraz z głowy). Co może być przyczyną zjadania pamięci ? Można to jakoś poprawić ?
Kodu nie wklejam bo go pisałem na szybko i ciężko byłoby się w nim połapać.
Pomóżcie jeżeli potraficie. [???]

0

no to zrob na zmiennych globalnych.
potem przy uruchamianiu programu daj:

C:=TCanvas.Create;
C.Handle:=GetWindowDC(GetDesktopWindow);

w timerze:

Col:=C.Pixels[p.x, p.y];

a w OnClose:

C.Free;

powinno pomoc.

0

Z tego co widzę pomogło. Chociaż wydaje mi się trochę dziwne, że wtedy zabierał pamięć program bo przecież uchwyt był zwalniany za każdym razem. No nic - posprawdzam jeszcze program i ew. dam znać. Pozdrawiam wszystkich.

0

Jednak widzę że to co pomogło stworzyło następny problem. Mianowicie jak chcę przesunąć jakieś okno (np. program albo IE ) to wtedy wysypuje się uchwyt pulpitu i źle odczytuje kolory (pokazuje kolor czarny a kod wskazuje że to kolor biały) i już tak zostaje. W sumie można nie używać opcji przesuwania okien myszką ale nie lubię jak jest coś 'nie do końca sprawne'. (sądzę że to psuje się uchwyt pulpitu)

0

hmmm...trodno jest mi w tym momencie pomoc bo "dziwne, u mnie dziala..."
ale sprawdzilem, ze najwiecej pamieci zzera samo:

GetWindowDC(GetDesktopWindow);

w sumie to bez sensu jest za kadzym razem odczytywanie tej samej wartosci...
uzyj zmiennej, np w OnCreate:

HDC:=GetWindowDC(GetDesktopWindow);

a potem uzywaj juz samego "HDC"....

0

Ten błąd wychodzi tylko na win98 (na XP jest OK). Jutro bedę przy delphi to pobawię się jeszcze.

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