Фильтр дисплея C # - PullRequest
       6

Фильтр дисплея C #

5 голосов
/ 02 марта 2010

Немного сложно объяснить, что мне нужно, но я попробую:

Мне нужно написать приложение (winform), которое будет своего рода фильтром для изображения / других форм позади него. За одним исключением - вся задняя форма должна выглядеть как есть, кроме красного (например) цвета, который должен быть заменен на любой другой указанный цвет, например белый.

Итак, давайте представим, что я открыл окна Word с несколькими строками текста. С красными и черными буквами. Поэтому, когда я размещаю свое приложение над этим текстом, оно должно «фильтровать» красные символы и заполнять их белым.

Итак, насколько я понимаю эту задачу: мне нужно привязать область за формой, затем обработать ее (заменить цвета) и затем нарисовать это изображение на теле формы.

Какие-либо ссылки или ключевые слова для решения?

UPD:

Итак - это мое окончательное решение:

  1. сделать форму прозрачной (используя свойства TransparencyKey и BackColor)
  2. поместите картинку поверх формы
  3. когда нам нужно обновить изображение в picturebox - мы заменяем текущее изображение на pictureBox1.Image = null; затем обновляем форму с помощью (this.Refresh ()) и делаем новый снимок

спасибо за все; -)

UPD 2: образец http://dl.dropbox.com/u/4486681/result.png

UPD 3: вот источников

Ответы [ 2 ]

3 голосов
/ 02 марта 2010

Вы можете создать снимок рабочего стола, используя следующий код:

public Bitmap CaptureScreen()
{
    Bitmap b = new Bitmap(SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height);
    Graphics g = Graphics.FromImage(b);
    g.CopyFromScreen(0, 0, 0, 0, b.Size);
    g.Dispose();
    return b;
}

Замените размеры и положение координатами вашей формы. Таким образом, вы получите растровое изображение того, что скрывается за вашей формой. Затем вы можете выполнить замену цвета на этом растровом изображении.

Обратите внимание, что из-за таких настроек, как ClearType и другие механизмы сглаживания, вы также должны учитывать "промежуточные пиксели" при замене цвета. В противном случае все будет выглядеть смешно: -)

0 голосов
/ 02 марта 2010

Я не знаю, можно ли вообще это сделать (посмотрим, что ответят другие: -).

Вы можете получить дескриптор контекста устройства экрана, который дает вам растровое изображение экрана.

HDC dc = GetDC (NULL);

(Это C ++, вам придется использовать P / Invoke или создать библиотеку смешанного режима в C ++)

Затем вы можете перерисовать область экрана в процессе фильтрации.

Теперь начинаются проблемы:

  • откуда вы знаете, что пиксели в вашем интересном регионе изменились?
  • если регион изменяется, видны ли изменения или они скрыты вашим собственным рисунком.

У вас может быть кнопка где-то, которая на мгновение скрывает ваше собственное приложение и показывает его обратно при повторном нажатии, и фильтрует новый контент.

Удачи. Есть ли возможность поделиться пользовательским сценарием?

...