Как эффективно привлечь рабочий стол в C#?

Я хочу потянуть непосредственно на рабочем столе в C#. От поиска немного, я закончил тем, что использовал Графический объект от Рабочего стола HDC (пустой указатель). Затем я нарисовал обычно использование этого Графического объекта.

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

Обычно, я должен был бы поместить свой код для прорисовки в событие "OnPaint", но такая вещь не существует для рабочего стола.

Как я сделал бы это?

Пример кода: https://stackoverflow.com/questions/1536141/how-to-draw-directly-on-the-windows-desktop-c

14
задан Community 23 May 2017 в 11:47
поделиться

4 ответа

Когда вы рисуете в HDC (NULL), вы рисуете на экран неуправляемым способом. Как вы обнаружили, как только Windows обновляет эту часть экрана, ваши изменения перезаписываются.

Есть несколько вариантов, в зависимости от того, чего вы хотите достичь:

  1. создать безграничный, возможно окно непрямоугольной формы. (Использовать SetWindowRgn, чтобы сделать окно непрямоугольный.) Вы можете сделать его дочерним по отношению к окну рабочего стола.
  2. подкласс окна рабочего стола. Это непросто и требует внедрение DLL в Explorer.exe процесс.
8
ответ дан 1 December 2019 в 10:02
поделиться

Я опубликовал два решения для аналогичного требования здесь

В основном у вас есть два варианта.

1- Получить графический объект для рабочего стола и начать рисовать на нем. Проблема заключается в том, что если вам нужно начать очищать то, что вы нарисовали ранее и т.д.

Point pt = Cursor.Position; // Get the mouse cursor in screen coordinates 

using (Graphics g = Graphics.FromHwnd(IntPtr.Zero)) 
{         
  g.DrawEllipse(Pens.Black, pt.X - 10, pt.Y - 10, 20, 20); 
}

2- Второй вариант, который я предлагаю в приведенной выше ссылке, заключается в создании прозрачного верхнего окна и выполнении всех рисунков в этом окне. Это, по сути, обеспечивает прозрачное перекрытие рабочего стола, на котором можно рисовать. Один из возможных недостатков этого способа, как я упоминал в исходном ответе, заключается в том, что другие окна, которые также являются крайними сверху и создаются после запуска приложения, будут заслонять ваше крайнее окно. Однако это можно решить, если это проблема.

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

BackColor = Color.LightGreen; 
TransparencyKey = Color.LightGreen; 
15
ответ дан 1 December 2019 в 10:02
поделиться

Чтобы получить OnPaint для рабочего стола, вам нужно подкласс окна рабочего стола и использовать вашу логику рисования, когда оно получает сообщение WM_PAINT/WM_ERASEBKGND.

Как говорится в теме, на которую вы ссылаетесь, вы можете перехватывать сообщения, посылаемые окну внешнего процесса, только используя хук (SetWindowsHookEx из DLL).

Как уже говорилось, прозрачное окно - это другой способ сделать это, или (в зависимости от частоты обновления) копирование, рисование и установка временных обоев (как это делает bginfo).

3
ответ дан 1 December 2019 в 10:02
поделиться

Это трудно сделать правильно.

Будет намного проще и надежнее создать собственную форму без полей.

1
ответ дан 1 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: