2012-01-15 10 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ミリ秒のタイマーとCursor.Positionを使用してください –

+0

@ハンスパッサント、タイマーソリューションは、x/yの位置を確認するための最も簡単なようです。私はちょうど今の位置を確認する方法を把握する必要があります。 +1の場合: – HelpNeeder

+0

@Cody Grey、3年前に質問が投稿された場​​合、この質問は重複していますか? – HelpNeeder

答えて

3

Hereコール(低レベルのマウスPROC)を処理するシステム・レベルのマウスイベントにMSDNドキュメントです。

Hereは、低レベルのマウスプロックを使用してスクロールイベントを変更する例です。

2番目のリンクの回答では、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を使用することができます。そこから、ラベルのテキストプロパティをXまたはY座標に簡単に設定できます。e(MouseMove EventArgs)から取得します。

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 Grey、私は知っています。しかし、私の質問は、私が何を参照するかということです。つまり、私がtextBox1に代わるものを意味していますか? – HelpNeeder

3

あなたはこれを達成するために、Windowsのフックを設定する必要があります。 MSDN記事How to set a Windows hook in Visual C# .NETは、マウスフックの設定方法を示しています。

私はそれを試してみました。マウスカーソルがコントロール上にあっても、フォーム全体にマウスをキャプチャしました。

+0

この例は、フォームに直接結びついているのではなく、フォームを見つける独立したスレッド用にセットアップされている点を除いて、優れています。 – mydogisbox

+0

はい、適応は簡単です。 –

関連する問題