如何限制鼠标在桌面的一部分范围内移动?
比如限制鼠标只在桌面的左半部分使用,过不了中线。
左半部分可以切换任何窗体,但是同样不能过中线。

解决方案 »

  1.   

    可以通过SetWindowsHookEx安装鼠标的低级钩子,发现鼠标光标移出边界后把光标设置到边界上。通常用VC做一个Win32 DLL来实现。
      

  2.   

    这个可能有帮助
    http://www.bcbbs.net/news/Content32245.aspx
      

  3.   

    用API可以实现
            [DllImport("user32.dll")]
            public static extern int SetCursorPos(int x, int y);        [DllImport("User32.dll ")]
            private static extern Int32 GetCursorPos(ref POINTAPI lpPoint);        public class POINTAPI
            {
                public Int32 x;
                public Int32 y;
            }        private void timer1_Tick(object sender, EventArgs e)  //监视鼠标位置
            {
                POINTAPI lPos = new POINTAPI();
                GetCursorPos(ref lPos);            if (lPos.y > SystemInformation.VirtualScreen.Height)  //过屏幕中线
                {
                    lPos.x = SystemInformation.VirtualScreen.Height / 2;
                    lPos.y = MousePosition.Y;
                }            SetCursorPos(lPos.x, lPos.y);
            }
      

  4.   


            IntPtr hookProc(int code, IntPtr wparam, IntPtr lparam)
            {
                if (code < 0) return CallNextHookEx(_nextHookPtr, code, wparam, lparam);            MSLLHOOKSTRUCT msllStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lparam, typeof(MSLLHOOKSTRUCT));
                if (msllStruct.pt.X>=300)
                {
                    this.Text = Cursor.Position.ToString();
                    SetCursorPos(300, msllStruct.pt.Y);
                }            return IntPtr.Zero;
            }        public void SetHook()
            {
                if (_nextHookPtr != IntPtr.Zero)
                {
                    return;
                }            HookProc myhookProc = new HookProc(hookProc);
                //_nextHookPtr = SetWindowsHookEx((int)HookType.MouseLL, myhookProc, IntPtr.Zero, GetCurrentThreadId()); 
                _nextHookPtr = SetWindowsHookEx((int)HookType.MouseLL, myhookProc, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
            }
    现在可以获得全局的鼠标事件了,但是没办法把鼠标限制在x<=300。只有当鼠标点了左右键的时候的,光标才会回到x<=300
      

  5.   

    直接   Cursor.Clip = new Rectangle(0, 0, 100, 100); 就可以了.
      

  6.   

    我明白你们的意思了,在hookProc里设置Cursor.Clip 啊。谢谢大家的帮忙啊,搞定了。
      

  7.   

    但窗口最小化 或者 通过atl+tab切换的窗口,这个hook回调函数就进不来了怎样解决