Я хочу потянуть непосредственно на рабочем столе в C#. От поиска немного, я закончил тем, что использовал Графический объект от Рабочего стола HDC (пустой указатель). Затем я нарисовал обычно использование этого Графического объекта.
Проблема состоит в том, что мои формы теряются, когда любая часть экрана перерисовывается. Я попробовал некоторое время цикл, но он на самом деле заканчивает тем, что тянул с такой скоростью, как приложение может, который не является частотой обновления рабочего стола.
Обычно, я должен был бы поместить свой код для прорисовки в событие "OnPaint", но такая вещь не существует для рабочего стола.
Как я сделал бы это?
Пример кода: https://stackoverflow.com/questions/1536141/how-to-draw-directly-on-the-windows-desktop-c
Когда вы рисуете в HDC (NULL), вы рисуете на экран неуправляемым способом. Как вы обнаружили, как только Windows обновляет эту часть экрана, ваши изменения перезаписываются.
Есть несколько вариантов, в зависимости от того, чего вы хотите достичь:
Я опубликовал два решения для аналогичного требования здесь
В основном у вас есть два варианта.
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;
Чтобы получить OnPaint
для рабочего стола, вам нужно подкласс окна рабочего стола и использовать вашу логику рисования, когда оно получает сообщение WM_PAINT/WM_ERASEBKGND
.
Как говорится в теме, на которую вы ссылаетесь, вы можете перехватывать сообщения, посылаемые окну внешнего процесса, только используя хук (SetWindowsHookEx
из DLL).
Как уже говорилось, прозрачное окно - это другой способ сделать это, или (в зависимости от частоты обновления) копирование, рисование и установка временных обоев (как это делает bginfo).
Это трудно сделать правильно.
Будет намного проще и надежнее создать собственную форму без полей.