Реализуйте указатель мыши и событие щелчка мыши для указанной области экрана - PullRequest
0 голосов
/ 12 августа 2010

У меня есть определенная область на экране (не на форме, а на экране), например, это область в верхнем правом углу экрана.

Rectangle specifiedRegion = new Rectangle(*,*,*,*);

Я хочуреализовать указатель мыши и событие щелчка мыши для этого региона.Когда мышь находилась над этой областью, в этой области появлялась какая-то кнопка или изображение.Если пользователь щелкнул эту область, событие щелчка мыши выполнено.

Как я могу это сделать?Пожалуйста, предоставьте некоторый код или хорошие ссылки.

C #, VS 2008, .net 2.0, 3.5

Ответы [ 2 ]

2 голосов
/ 12 августа 2010

Просто предупреждение, прежде чем мы начнем, что решение не будет красивым, AFAIK, вы не можете сделать это полностью в управляемом коде.

Теперь тогда:

Чтобы перехватитьсообщения в другое приложение, вам нужно сделать некоторые собственные вызовы, используя User32.dll.Если вы хотите разобраться во всем этом непросто, начните с SetWindowsHookEx .

Если вы не мазохист, есть хорошая библиотека C #, которую я нашел в CodeProject, что сделает жизнь намного проще, чем пытаться перехватить эти сообщения вручную.Установите обратный вызов для сообщений мыши с координатами X и Y для положения мыши, которое вы можете определить, находится ли оно в пределах вашего Rectangle, используя его метод Contains.

specifiedRegion.Contains(mouseLocation); //where mouseLocation is a Point

User32 также имеетфункции, которые вам понадобятся для получения контекста устройства для экрана:

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

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

Чтобы получить DC для экрана, используйте следующий вызов GetDC:

IntPtr screenDC = GetDC(IntPtr.Zero);

С этимDC мы можем получить наш объект C # Graphics и начать рисовать.

Graphics g = Graphics.FromHdc(screenDC);

Не забудьте утилизировать объект Graphics и освободить DC после того, как закончите с ним, иначе у вас будет утечка памяти.*

g.Dispose();
ReleaseDC(screenDC);
1 голос
/ 01 марта 2011

Существует очень простой способ сделать это. Просто сделайте панель управления в регионе, где вы хотите, чтобы это произошло. Используйте события mousemove и mouseclick элемента управления панели для захвата ваших входных данных, и вы даже можете скопировать любое изображение на панель. Это инкапсулирует всю операцию внутри панели, исключая необходимость обработки за пределами класса панели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...