2012-01-15 3 views
4

MSDN의 예제에서 커서 위치를 수정하는 방법을 알고 있습니다.마우스 X/Y 위치를 추적하여 레이블에 인쇄하는 방법?

제 질문은 마우스가 움직이는 동안 마우스 위치를 확인한 다음 X 및 Y 위치를 레이블을 나타내는 것으로 인쇄하는 방법입니다.

EDIT : 전체 화면에서 내 마우스 위치를 추적하고 싶습니다.

편집 2 : 내 응용 프로그램은 뒷 배경/최소화됩니다.

는 이미 마우스 후크를 사용하고 있습니다 : 그것은 마우스 좌표를 보유하고 있기 때문에

namespace Program 
{ 
    public partial class MouseHook 
    { 
     [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
     private static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, IntPtr dwExtraInfo); 

     private const int MOUSEEVENTF_LEFTDOWN = 0x02; 
     private const int MOUSEEVENTF_LEFTUP = 0x04; 
     private const int MOUSEEVENTF_RIGHTDOWN = 0x08; 
     private const int MOUSEEVENTF_RIGHTUP = 0x10; 

     public void DoMouseClick() 
     { 
      int X = Cursor.Position.X; 
      int Y = Cursor.Position.Y; 

      IntPtr newP = new IntPtr(Convert.ToInt64("0", 16)); 
      mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, newP); 
     } 
    } 
} 
+4

이것은 이미 여러 번 요청되었습니다. 검색 창에 "+ setwindowshookex + wh_mouse_ll"을 입력하십시오. 아니면 그냥 50 msec 타이머와 커서를 사용하십시오. 위치 –

+0

@ 한자 Passant, 타이머 솔루션은 x/y 위치를 확인하는 가장 간단한 것 같습니다. 이제 위치를 확인하는 방법을 알아야합니다. +1 : – HelpNeeder

+0

@Cody Grey, 질문이 정답 3 년 전에 게시 된 경우이 질문은 어떻게 중복됩니까? – HelpNeeder

답변

3

Here 통화 (낮은 수준의 마우스 PROC)를 처리하는 시스템 레벨의 마우스 이벤트에 대한 MSDN 설명서입니다.

Here은 저급 마우스 프로 시저를 사용하여 스크롤 이벤트를 변경하는 예입니다.

두 번째 링크의 대답에서 WM_MOUSEMHVE는 WM_MOUSEWHEEL 대신 here에서 사용하십시오.

주의 사항 :이 프로그램이 높은 권한으로 프로그램에 마우스를 올려 놓았을 때 마우스 이벤트를 계속 캡처하려면이 프로그램을 높은 권한으로 실행해야합니다. (하지 테스트)

코드 :

using System; 

using System.Diagnostics; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace CatchMouseMove 
{ 
    class InterceptMouse 
    { 
     const int INPUT_MOUSE = 0; 
     const int MOUSEEVENTF_WHEEL = 0x0800; 
     const int WH_MOUSE_LL = 14; 


     private static LowLevelMouseProc _proc = HookCallback; 
     private static IntPtr _hookID = IntPtr.Zero; 

     public static void Main() 
     { 
      _hookID = SetHook(_proc); 

      if (_hookID == null) 
      { 
       MessageBox.Show("SetWindowsHookEx Failed"); 
       return; 
      } 
      Application.Run(); 
      UnhookWindowsHookEx(_hookID); 
     } 

     private static IntPtr SetHook(LowLevelMouseProc proc) 
     { 
      using (Process curProcess = Process.GetCurrentProcess()) 
      using (ProcessModule curModule = curProcess.MainModule) 
      { 
       return SetWindowsHookEx(WH_MOUSE_LL, proc, 
        GetModuleHandle(curModule.ModuleName), 0); 
      } 
     } 

     private delegate IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam); 

     private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
     { 
      int xPos = 0; 
      int yPos = 0; 

      if (nCode >= 0 && MouseMessages.WM_MOUSEMOVE == (MouseMessages)wParam) 
      {  
       xPos = GET_X_LPARAM(lParam); 
       yPos = GET_Y_LPARAM(lParam); 

       //do stuff with xPos and yPos 
      } 
      return CallNextHookEx(_hookID, nCode, wParam, lParam); 
     } 


     private enum MouseMessages 
     { 
      WM_MOUSEMOVE = 0x0200 
     } 

     [StructLayout(LayoutKind.Sequential)] 
     private struct POINT 
     { 
      public int x; 
      public int y; 
     } 

     [StructLayout(LayoutKind.Sequential)] 
     private struct MSLLHOOKSTRUCT 
     { 
      public POINT pt; 
      public int mouseData; 
      public int flags; 
      public int time; 
      public IntPtr dwExtraInfo; 
     } 

     public struct INPUT 
     { 
      public int type; 
      public MOUSEINPUT mi; 
     } 

     [StructLayout(LayoutKind.Sequential)] 
     public struct MOUSEINPUT 
     { 
      public int dx; 
      public int dy; 
      public int mouseData; 
      public uint dwFlags; 
      public int time; 
      public int dwExtraInfo; 
     } 



     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern IntPtr SetWindowsHookEx(int idHook, 
      LowLevelMouseProc lpfn, IntPtr hMod, uint dwThreadId); 

     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     private static extern bool UnhookWindowsHookEx(IntPtr hhk); 

     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, 
      IntPtr wParam, IntPtr lParam); 

     [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern IntPtr GetModuleHandle(string lpModuleName); 

    } 

} 
2

당신은 MouseMove event의있는 EventArgs를 사용할 수 있습니다. 여기에서 레이블의 텍스트 속성을 e (MouseMove EventArgs)에서 가져올 X 또는 Y 좌표로 쉽게 설정할 수 있습니다.

private void Form_MouseMove(object sender, MouseEventArgs e) 
{ 
    // Update the mouse coordinates displayed in the textbox. 
    myTextBox.Text = e.Location.ToString(); 
} 
+0

좋습니다. 아이디어가 있습니다. 그러나 나는 핸들러를 수행 할 객체를 가져야하기 때문에 :'textBox1.TextChanged + = new EventArgs (textBox1_TextChanged);'어떤 객체를 호출 할 것인가? – HelpNeeder

+1

@Help :'TextChanged'가 잘못된 이벤트입니다. 'MouseMove' 이벤트를 처리하려고합니다. 그 이벤트 핸들러 메서드 안에서, 텍스트 박스를 업데이트하십시오 :'textBox1.Text = e.Location.ToString();' –

+0

@Cody Gray, 알아요. 하지만 내 질문은 어떤 객체를 참조할까요? 즉, textBox1을 대체 할 대상이 무엇입니까? – HelpNeeder

3

이를 달성하기 위해 윈도우 후크를 설정해야합니다. MSDN 문서 How to set a Windows hook in Visual C# .NET은 마우스 후크를 설정하는 방법을 보여줍니다.

마우스 커서를 컨트롤 위에 올려 놓았을 때도 폼 전체에서 마우스를 캡처했습니다.

+0

이 예제는 폼에 직접 연결되는 대신 폼을 찾는 독립적 인 스레드에 대한 설정을 제외하고 좋습니다. – mydogisbox

+0

네, 그렇지만 적응하기 쉽습니다. –

관련 문제