none
模拟鼠标操作 调用API RRS feed

  • 问题


  •     在模拟鼠标时候 鼠标会自动移动到先前设置的点 我想问问 有没有方法 可以让真实鼠标不动 但是移动的操作还是可以继续,换句话说 就是模拟鼠标 该干什么就干什么 不能影响我自己的操作!
    谢谢!
    2010年1月15日 6:06

答案

  • Windows API
    [DllImport("user32.dll")]        static extern bool SetCursorPos(int X, int Y); 
    该函数可以改变鼠标指针的位置。其中X,Y是相对于屏幕左上角的绝对位置。

    另一个函数是:[DllImport("user32.dll")]        static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo);
    这个函数不仅可以设置鼠标指针绝对的位置,而且可以以相对坐标来设置。另外,该函数还可以模拟鼠标左右键点击、鼠标滚轮操作等。
    其中的MouseEventFlag是一个基于uint类型的枚举,定义如下:
            [Flags]
            enum MouseEventFlag : uint
            {
                Move = 0x0001,
                LeftDown = 0x0002,
                LeftUp = 0x0004,
                RightDown = 0x0008,
                RightUp = 0x0010,
                MiddleDown = 0x0020,
                MiddleUp = 0x0040,
                XDown = 0x0080,
                XUp = 0x0100,
                Wheel = 0x0800,
                VirtualDesk = 0x4000,
                Absolute = 0x8000
            }
    关于这两个函数的详细说明,可以查看MSDN Library或者Windows的Platform SDK文档。

    • 已标记为答案 强少 2010年1月18日 3:55
    • 取消答案标记 强少 2010年1月18日 6:18
    • 已标记为答案 强少 2010年1月20日 4:10
    2010年1月15日 8:30

全部回复

  • 你想要做什么工作,执行什么操作,
    按你说的,就不需要模拟鼠标来实现,
    如果你想模拟鼠标操作,又不想让指针移动,有点困难


    努力+方法=成功
    2010年1月15日 6:12
  • 你好!
         你可以使用mouse_event这个API来模拟鼠标操作!并不一定非要移动鼠标指针的,你可以用这个API直接在特定位置点击,而鼠标指针是不动的!
    周雪峰
    2010年1月15日 7:48
    版主
  • Windows API
    [DllImport("user32.dll")]        static extern bool SetCursorPos(int X, int Y); 
    该函数可以改变鼠标指针的位置。其中X,Y是相对于屏幕左上角的绝对位置。

    另一个函数是:[DllImport("user32.dll")]        static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo);
    这个函数不仅可以设置鼠标指针绝对的位置,而且可以以相对坐标来设置。另外,该函数还可以模拟鼠标左右键点击、鼠标滚轮操作等。
    其中的MouseEventFlag是一个基于uint类型的枚举,定义如下:
            [Flags]
            enum MouseEventFlag : uint
            {
                Move = 0x0001,
                LeftDown = 0x0002,
                LeftUp = 0x0004,
                RightDown = 0x0008,
                RightUp = 0x0010,
                MiddleDown = 0x0020,
                MiddleUp = 0x0040,
                XDown = 0x0080,
                XUp = 0x0100,
                Wheel = 0x0800,
                VirtualDesk = 0x4000,
                Absolute = 0x8000
            }
    关于这两个函数的详细说明,可以查看MSDN Library或者Windows的Platform SDK文档。

    • 已标记为答案 强少 2010年1月18日 3:55
    • 取消答案标记 强少 2010年1月18日 6:18
    • 已标记为答案 强少 2010年1月20日 4:10
    2010年1月15日 8:30
  • 谢谢!

    2010年1月18日 4:32
  •  [DllImport("user32.dll", EntryPoint = "mouse_event")]
            public static extern void mouse_event(
                int dwFlags,
                int dx,
                int dy,
                int cButtons,
                int dwExtraInfo
            );

    您好,还是遇到了问题
                int X = -100;
                int Y = 200;

                mouse_event(MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0);
                mouse_event(MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
    我这样执行鼠标的点击操作,为什么点击的时候确实鼠标停留的地点,鼠标根本就没有移动;

    然后我试了加一句mouse_event(MOUSEEVENTF_MOVE, X, Y, 0, 0);那么鼠标就会移动到那个地点!但是鼠标指针却动了!

      mouse_event(MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0);这个函数里面X Y参数数好像没有用到!请假!

    2010年1月18日 6:10
  • 你好!
         mouse_event(MOUSEEVENTF_MOVE, X, Y, 0, 0);的作用就是启动鼠标指针的!X,Y是设置坐标用的!
    周雪峰
    2010年1月18日 7:04
    版主
  • 您好 !
       那这样的话是不是每次执行鼠标点击操作都先要执行MOUSEEVENTF_MOVE移动到指定的地点,那这样的话鼠标指针就动了!
    那这样的话就没达到我想要的鼠标指针不动,但是鼠标会单击事先设置好的点!

    您说过:
    通过mouse_EVENT可以用这个API直接在特定位置点击,而鼠标指针是不动的!
    请问怎么样实现呢?

    2010年1月18日 8:14
  • 你好!
    你可以把这行删除:
    mouse_event(MOUSEEVENTF_MOVE, X, Y, 0, 0);

    只用下面两行就可以模拟在特定坐标的鼠标点击操作了!
    mouse_event(MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0);
    mouse_event(MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
    周雪峰
    2010年1月18日 8:38
    版主
  • 你好
    刚开始用的就是这两句
    不过我又试了下
    只用mouse_event(MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0);
    mouse_event(MOUSEEVENTF_LEFTUP, X, Y, 0, 0);这两个操作
    鼠标会点击,但是是在鼠标指针停留的位置点击,并没有在(X,Y)这个点点击!
    也就这两句只执行了点击操作 ,却没有模拟在特定的坐标来点击!请教!

    2010年1月19日 7:37
  • 你好!
    刚才试了一下,必须移动指针,不然LEFTDOWN和LEFTUP事件都没有效果!
    我上面的回复说的不对,不好意思啊!
    周雪峰
    2010年1月19日 8:04
    版主
  • 依然谢谢你!

    还请问下:
    按照3楼(徐悦)的说法,mouse_event里面的int dx, int dy两个参数可以设置为相对坐标或者绝对坐标,那么没有可能实现
    我想要的效果呢!
    MouseEventFlag flags里面的参数我就设置为LEFTDOWN或者是LEFTUP!请教!

    2010年1月19日 8:11
  • 默认情况下是相对坐标,相对上次mouse_event发生鼠标移动的mickey的数量,想使用绝对坐标可以这样:
    mouse_event((int)(MouseEventFlag.Move|MouseEventFlag.Absolute), X, Y, 0, 0);
    周雪峰
    2010年1月19日 8:52
    版主
  • 谢谢!

    2010年1月20日 4:09