GetPixel в приложении DirectX

У меня такой код:

procedure TForm1.Button1Click(Sender: TObject);
var
  XYCoord: integer;
  window: hwnd;
  c: TCanvas;
  result : TColor;
  color : string;
begin
  c := TCanvas.Create;
  window := FindWindow('Atlantica Online', NIL);
  try
    c.Handle := GetWindowDC(window);
    Result   := GetPixel(c.Handle, 50, 10);
  finally
    c.Free;
  end;
  color := GetColorASRGBString(result, true);
  if color = '#FF0000' then
  begin
    SendMessage(window, WM_LBUTTONDOWN, MK_LBUTTON, makelong(50, 10));
    SendMessage(window, WM_LBUTTONUP, MK_LBUTTON, makelong(50, 10));
  end;
end;

function TForm1.GetColorASRGBString(
  const ColorToConvert : TColor;
  const IncludePrefixChar: Boolean): String;
var
  r,g,b         : Byte;
  CurrentColor  : TColor;
  HexColorWithSpaces : String;
const
  HexFormatStr  : String = '%2x';
begin
  CurrentColor  := ColorToConvert;

  CurrentColor  := ColorToRGB(CurrentColor);
  r := GetRValue(CurrentColor);
  g := GetGValue(CurrentColor);
  b := GetBValue(CurrentColor);

  HexColorWithSpaces := IfThen(IncludePrefixChar, '#','')
    + Format(HexFormatStr, [r])
    + Format(HexFormatStr, [g])
    + Format(HexFormatStr, [b]);
  Result := AnsiReplaceStr(HexColorWithSpaces, ' ', '0');
end;

Если заданный пиксель в данном окне красный (255,0,0), он должен щелкнуть там ...

Очень хорошо работает для любого обычного приложения ...

Но если приложение использует DirectX, оно не работает (возвращает черный цвет (# 000000)) ...

Есть ли какие-то решения для этого без необходимости подключать директкс?

заранее спасибо


person Michael Grenzer    schedule 20.09.2012    source источник
comment
в моем почтовом ящике показаны 2 комментария .. почему я их не вижу? :(   -  person Michael Grenzer    schedule 21.09.2012
comment
Это я говорил вам, что вам нужно использовать функцию DirectX, поскольку функция GDI не может получить доступ к буферам рисования DirectX, потому что они работают на другом уровне, но я удалил их позже ...   -  person TLama    schedule 21.09.2012
comment
Значит, мне действительно нужно было бы подключить функции DirectX приложения, в котором я хочу читать пиксели, копировать буфер, а затем искать этот?   -  person Michael Grenzer    schedule 21.09.2012


Ответы (1)


Я думаю, что вы ищете IDirect3DSurface9 :: GetDC Назначьте этот DC своему холсту, и все будет хорошо. Немного погуглив, и вы получите много информации об IDirect3DSurface9 :: GetDC.

person iamjoosy    schedule 20.09.2012
comment
Но ... наконец-то нужно подключить эту функцию, потому что мне нужен не собственный вывод DirectX, а из другого приложения ... - person Michael Grenzer; 21.09.2012