Использование System.Drawing для рисования перекрестия на рабочем столе?

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

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

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


person Michael D. Browning    schedule 08.08.2011    source источник


Ответы (3)


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

[DllImport("User32.dll")]
static extern IntPtr GetDC(IntPtr hwnd);

[DllImport("User32.dll")]
static extern void ReleaseDC(IntPtr dc);

private void DrawDeskTop()
{
  IntPtr desk = GetDC(IntPtr.Zero);
  using (Graphics g = Graphics.FromHdc(desk))
  {
    g.FillRectangle(Brushes.Red, new Rectangle((SystemInformation.WorkingArea.Width / 2) - 4, (SystemInformation.WorkingArea.Height / 2) - 20, 8, 40));
    g.FillRectangle(Brushes.Red, new Rectangle((SystemInformation.WorkingArea.Width / 2) - 20, (SystemInformation.WorkingArea.Height / 2) - 4, 40, 8));
  }
  ReleaseDC(desk);
}

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

person LarsTech    schedule 08.08.2011
comment
Красиво и просто! Мне это нравится. Как вы сказали, у него есть несколько отверстий, но он работает так, как объяснено! - person Billy; 09.08.2011

Вы не можете рисовать на рабочем столе на нативном уровне (возможно, за исключением некоторых хаков в поддержку Win16, которые отключают композицию и всякие другие ужасы), поэтому, конечно, не с System.Drawing. Для этого вам нужно будет создать прозрачное окно размером не менее размера изображения и рисовать на нем.

person Simon Buchan    schedule 08.08.2011
comment
В некотором роде развивая эту идею использования полноэкранного прозрачного окна, не сделает ли это также и перо прозрачным на форме? как это обойти? - person Michael D. Browning; 09.08.2011
comment
Прозрачный не значит невидимый. Я мог бы привести несколько нативных примеров того, как их реализовать (я бы использовал WS_EX_LAYERED и реализовал WM_PAINT), но я недостаточно знаком с Forms, чтобы знать, возможно ли это вообще в нем. PS: на самом деле вы хотите, чтобы окно было как можно меньше для производительности. - person Simon Buchan; 09.08.2011

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

Если вам нужно сделать это с помощью кода, я бы рассмотрел использование WPF. Это упростит проблему прозрачности. Тем не менее, у вас все еще есть приложение поверх рабочего стола. Вам придется иметь дело с этой проблемой (и, возможно, с некоторыми другими).

person Billy    schedule 08.08.2011
comment
Билли, я не думаю, что это слишком сложная проблема, я просто плохо разбираюсь в графической библиотеке. Хотя ваша идея теоретически сработает, я бы предпочел иметь утилиту для этой цели. - person Michael D. Browning; 09.08.2011
comment
Использование пространства имен System.Drawing подразумевает, что вы используете WinForms для создания этого приложения. Если вы перейдете к графике GDI +, она может быстро стать ужасной. Я действительно не знаю, как это сделать, не делая полноэкранное окно прозрачным. Ваш вопрос также подразумевает, что у вас будет приложение поверх рабочего стола... поэтому вам придется разрешить взаимодействие с рабочим столом через ваше приложение. Я также могу думать о нескольких других проблемах. Я не эксперт в этой области, поэтому я хотел бы также увидеть более простой подход. - person Billy; 09.08.2011
comment
Билли, я боялся, что так и будет, и искренне ценю ваши отзывы/советы в этом вопросе. Я думаю, что я собираюсь пойти с чит-методом использования полноэкранного прозрачного окна и использования пера для рисования на форме. - person Michael D. Browning; 09.08.2011