Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2013, 21:15   #1
romka1608
Пользователь
 
Регистрация: 12.08.2013
Сообщений: 41
Счастье Перемещени курсора на цвет пикселя

мне нужно когда я нажимаю Mouse1(НЕ ТОЛЬКО В ПРОГРАММЕ,а И НА РОБОЧЕМ СТОЛЕ ,к примеру),
то курсор перемещаеться на цвет пикселя пиксель


иСпользую этот код


Код:
procedure TForm1.Button3Click(Sender: TObject);
var
    hwnd:THandle;
    p:Tcolor;
    i,j:integer;
    bit:TBitmap;
    flag:boolean;
    pos:tpoint;
begin
flag:=false;   // флаг выхода из первого цикла
p:=rgb(183,187,185);
bit:=TBitmap.Create;
bit.Width := Screen.Width;
bit.Height := Screen.Height;
hwnd:=FindWindow(nil, 'имя окна');
BitBlt(bit.Canvas.Handle, 0, 0, Width, Height, GetDC(hwnd), 0, 0,SRCCOPY );
 
for i:=0 to bit.Width do begin
  for j:=0 to bit.Height do
    if bit.Canvas.Pixels[i,j]=p then begin
       flag:=true;
       break;
    end;
if flag then
  break;
end;


но после нажатие button всё зависает
romka1608 вне форума Ответить с цитированием
Старый 27.08.2013, 21:40   #2
asmprog
Пользователь
 
Регистрация: 10.08.2013
Сообщений: 67
По умолчанию

вопрос то в чем? виснет - а вы в фотошопе за какое время сможете цвет каждого пикселя проверить(тем более, что работа идет со снимком экрана, вроде как)?
asmprog вне форума Ответить с цитированием
Старый 28.08.2013, 00:48   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  p: Tcolor;
  i, j: integer;
  bit: TBitmap;
  flag: boolean;
  t: tdatetime;
begin
  flag := false;
  p := rgb(94, 168, 38);
  bit := TBitmap.Create;
  bit.Width := Screen.Width;
  bit.Height := Screen.Height;
  BitBlt(bit.Canvas.Handle, 0, 0, bit.Width, bit.Height, GetDC(0), 0, 0, SRCCOPY);

  t := now;
  for i := 0 to bit.Height - 1 do
  begin
    for j := 0 to bit.Width - 1 do
      if bit.Canvas.Pixels[j, i] = p then
      begin
        flag := true;
        break;
      end;
    if flag then
      break;
  end;
  caption := FormatDateTime('s.zzz', now - t);

  if flag then
    setcursorpos(j, i);

  bit.Free;
end;
1.4 секунды для "осмотра" экрана 1366 на 768.
Чтобы выполнять поиск по нажатию мыши, ищите "delphi mouse click hook" (пример).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 28.08.2013, 07:21   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,881
По умолчанию

TBitmap.ScanLine должен работать гораздо быстрее, чем TBitmap.Canvas.Pixels
Можно поискать примеры в разделе программирования игр.
phomm вне форума Ответить с цитированием
Старый 28.08.2013, 11:49   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
TBitmap.ScanLine должен работать гораздо быстрее, чем TBitmap.Canvas.Pixels.
И правда. Вчера почему-то не дало выигрыша (2.6 секунды против 1.4 - наверное, где-нибудь "налажал").

0.004 секунды на экране 1366 на 768:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, dx: integer;
  bit: TBitmap;
  flag: boolean;
  t: tdatetime;
  Pixels: PByteArray;
const
  red1 = 94;
  green1 = 168;
  blue1 = 38;
begin
  flag := false;
  bit := TBitmap.Create;
  bit.PixelFormat := pf24bit;
  bit.Width := Screen.Width;
  bit.Height := Screen.Height;
  BitBlt(bit.Canvas.Handle, 0, 0, bit.Width, bit.Height, GetDC(0), 0, 0, SRCCOPY);

  t := now;
  dx := DWord(bit.ScanLine[1]) - DWord(bit.ScanLine[0]);
  Pixels := bit.ScanLine[0];
  for i := 0 to bit.Height - 1 do
  begin
    for j := 0 to bit.Width - 1 do
    begin
      flag := (Pixels[j * 3 + 2] = red1) and (Pixels[j * 3 + 1] = green1) and (Pixels[j * 3] = blue1);
      if flag then
        break;
    end;
    if flag then
      break;
    inc(DWord(Pixels), dx);
  end;
  caption := FormatDateTime('s.zzz', now - t);

  if flag then
    setcursorpos(j, i);

  bit.Free;
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 28.08.2013 в 11:53.
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цвет пикселя hiho Общие вопросы Delphi 5 21.06.2013 00:00
Неверно распознается цвет пикселя Риндера Мультимедиа в Delphi 10 03.09.2011 01:02
Узнать цвет пикселя. sergeyrulit Общие вопросы Delphi 6 02.07.2010 11:55
Как определить цвет пикселя? zotox Общие вопросы Delphi 2 15.11.2009 19:05