2010-04-12 4 views
2

시스템 커서를 강조 표시하는 방법? 많은 스크린 레코딩 응용 프로그램처럼. 이상적으로, 나는 그 주위에 후광을 보여주고 싶다. 감사합니다C# 커서 강조/팔로워

답변

5

순수하게 관리되는 솔루션의 경우 다음 코드는 바탕 화면에 현재 마우스 커서 위치에 타원을 그립니다.

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); 
} 

타이머를 사용하면 예를 들어 20ms마다 마우스 위치를 업데이트하고 새로운 hallow (타원)을 그릴 수 있습니다.

내가 생각할 수있는 다른보다 효율적인 방법이 있지만 시스템 후크를 사용하여 코드 변환되지 않은 코드가 필요합니다. 이것에 대한 자세한 정보는 SetWindowsHookEx를보십시오.

업데이트 : 여기 내 의견에 설명 된 해결책의 샘플이 있습니다. 테스트하기 쉽고 간단합니다.

public partial class Form1 : Form 
    { 
    private HalloForm _hallo; 
    private Timer _timer; 

    public Form1() 
    { 
     InitializeComponent(); 
     _hallo = new HalloForm(); 
     _timer = new Timer() { Interval = 20, Enabled = true }; 
     _timer.Tick += new EventHandler(Timer_Tick); 
    } 

    void Timer_Tick(object sender, EventArgs e) 
    { 
     Point pt = Cursor.Position; 
     pt.Offset(-(_hallo.Width/2), -(_hallo.Height/2)); 
     _hallo.Location = pt; 

     if (!_hallo.Visible) 
     { 
     _hallo.Show(); 
     } 
    }  
    } 

    public class HalloForm : Form 
    {   
    public HalloForm() 
    { 
     TopMost = true; 
     ShowInTaskbar = false; 
     FormBorderStyle = FormBorderStyle.None; 
     BackColor = Color.LightGreen; 
     TransparencyKey = Color.LightGreen; 
     Width = 100; 
     Height = 100; 

     Paint += new PaintEventHandler(HalloForm_Paint); 
    } 

    void HalloForm_Paint(object sender, PaintEventArgs e) 
    {  
     e.Graphics.DrawEllipse(Pens.Black, (Width - 25)/2, (Height - 25)/2, 25, 25); 
    } 
    } 
+0

감사합니다 크리스, 나는 후크와 Graphics.FromHwnd를 사용하여 반투명 후광을 그렸습니다. 그러나 이전에 그린 서클을 지우는 데 문제가 있습니다. InvalidateRect가 IntPtr.Zero 또는 GetDesktopWindow에서 올바르게 작동하지 않는 것 같습니다. 어떤 아이디어? – SharpAffair

+0

안녕하세요, John 님, 데스크톱 복원 문제를 생각하고 있었는데 다음과 같은 아이디어가있었습니다. 처음에 제안한 것처럼 바탕 화면에 직접 그리는 대신 지금 양식을 사용해야하는 이유는 무엇입니까? 따라서 Form, Hallow Form을 새로 만들고 FormBorderStyle = None, BackColor = LightGreen, TransparencyKey = LightGreen, TopMost = true, ShowInTaskBar = false, Width = 100, Height = 100으로 설정하십시오. 이렇게하면 표시되지 않는 양식이 표시되지만 PaintEvent에서 양식에 그리는 모든 항목이 표시됩니다. 그런 다음 초기 응답에서 타이머 이벤트에서 마우스를 추적 할 창 위치를 업데이트하십시오. 빠른 테스트에서 괜찮아 보였습니다. –

+0

내가 생각할 수있는 명백한 문제는 다른 창문이 창문보다 맨 위에 오게되면이 창문이이 창문 위에 나타나지 않는다는 것입니다. –