我是新手,现在在赶毕业论文。本来想用c#来做个模拟鼠标软件,想把数据付给滚轮事件的delta变量,但是发现delta是只读的,然后找了很多关于怎么模拟鼠标滚轮滚动的资料,看到c里面可以做到运用SendMessage来完成,但是c#里面没有SendMessage,然后又找到一个介绍怎么用C#来实现C的SendMessage的效果(连接:http://www.builder.com.cn/2007/0907/495420.shtml)。但是不是说的很具体,还是不是很明白怎么用。请各位帮帮我。最好可以有具体的使用方法介绍,语句是什么意思等。 
    十分急,希望大家尽力帮忙,不胜感激!!

解决方案 »

  1.   

    用两个API函数实现就行。[DllImport("user32.dll")]
            static extern bool SetCursorPos(int X, int Y);
            [DllImport("user32.dll")]
            static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo);
            [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
            }SetCursorPos使鼠标移动到指定位置;mouse_event使用MouseEventFlag枚举中的Move,也可以使鼠标移动。
    mouse_event中使用不同的枚举值可以模拟不同的鼠标事件。
    值得注意的是有几点: 1. 我们不能用mouse_event(MouseEventFlag.LeftDown, 10, 10, 0, UIntPtr.Zero);去模拟在(10, 10)处的左键事件,我们需要把这步拆成两步:第一步:移动鼠标到(10,10)处,用SetCursorPos(10, 10);第二步:触发左键,用mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero);本质上是两步的事件,不能把window API 想的太聪明,认为它会自动跑到(10,10)处,再左键 2. MouseEventFlag的枚举值可以多个一起用,使用 | 操作符鼠标左键按下和松开两个事件的组合即一次单击:
    mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )
    两次连续的鼠标左键单击事件 构成一次鼠标双击事件:
    mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )
    mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )
    3. MouseEventFlag中有个Absolute枚举,如果没指定Absolute, 则mouse_event的操作是相对于上次鼠标所在的位置;如果指定了Absolute,则是相对于整个屏幕坐标的位置。这里要注意,指定Absolute,鼠标的坐标会被约束在[0, 65535]之间。0即对应屏幕左,65535即对应屏幕右下角。MSDN原话如下:If MOUSEEVENTF_ABSOLUTE value is specified, dx and dy contain normalized absolute coordinates between 0 and 65,535. The event procedure maps these coordinates onto the display surface. Coordinate (0,0) maps onto the upper-left corner of the display surface, (65535,65535) maps onto the lower-right corner. 所以模拟在(10, 10)处的左键,代码应改为:mouse_event(MOUSEEVENTF_LEFTDOWN, 10 * 65536 / Screen.PrimaryScreen.Bounds.Width, 10 * 65536 / Screen.PrimaryScreen.Bounds.Height, 0, 0);如果显示器是一拖二的,想在第二个屏上使用mouse_event,就不能用Screen.PrimaryScreen了
      

  2.   

    用API函数吧~~具体我看3L的写的蛮详细的了~
      

  3.   

    可以用PostMessage(不是SendMessage)发送WM_MOUSEWHEEL消息,wParam的高16位是delta值,详见MSDN。
      

  4.   

    上面搞错了,更正一下,鼠标滚轮消息用PostMessage和SendMessage都可以。
    给你段C++代码参考一下,这段代码是让记事本窗口每隔0.1秒向下滚动一下。
    HWND notepad = FindWindow(_T("Notepad"), 0);
    HWND edit = FindWindowEx(notepad, 0, _T("Edit"), 0);
    for (int i=0; i<100; i++)
    {
    Sleep(100);
    SendMessage(edit, WM_MOUSEWHEEL, -120<<16, 0);
    }