admin 管理员组

文章数量: 887021

WINCE下模拟鼠标点击,移动

最近进行一个车载项目, 碰到这样的需求: 通过串口接收鼠标的按下/弹起和坐标消息, 在WINCE下模拟鼠标消息.经过努力, 得出了两个方案:

1. 使用广播发送鼠标消息

2. 使用mouse_event. 实际测试的时候

经过测试, 发现广播发送鼠标消息效果不佳:

int x = 100;
int y = 100;
PostMessage((IntPtr)HWND_BROADCAST, WM_LBUTTONDOWN, (IntPtr)0, (IntPtr)(y << 16 | x));
PostMessage((IntPtr)HWND_BROADCAST, WM_LBUTTONUP, (IntPtr)0, (IntPtr)(y << 16 | x));
PostMessage((IntPtr)HWND_BROADCAST, WM_MOUSEMOVE, (IntPtr)1, (IntPtr)(y << 16 | x));

    具体表现为在普通的点击(DOWN, UP)没有太大问题, 但是对于车载导航的手写, 就写不出来了(没有找到原因, 可能是车载倒车不仅仅需要MOVE消息, 还需要TOUCH消息吧, 我从下文反推回来的). 所以就采用了mouse_event的方法.

鼠标按下:
mouse_event(MOUSEEVENTF_TOUCH | MOUSEEVENTF_ABSOLUTE, dx, dy, 0, 0);
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE, dx, dy, 0, 0);鼠标移动:
mouse_event(MOUSEEVENTF_TOUCH | MOUSEEVENTF_ABSOLUTE, dx, dy, 0, 0);
mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, dx, dy, 0, 0);鼠标弹起:
mouse_event(MOUSEEVENTF_TOUCH | MOUSEEVENTF_ABSOLUTE, dx, dy, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE, dx, dy, 0, 0);

这里特别说明:
    在wince上面, 需要先发送一个MOUSEEVENTF_TOUCH, 然后再发送MOUSEEVENTF_LEFTDOWN, MOVE, UP消息.
如果指定了MOWSEEVENTF_ABSOLOTE值,则dx和dy含有标准化的绝对坐标,其值在0到65535之间。事件程序将此坐标映射到显示表面。坐标(0,0)映射到显示表面的左上角,(6553,65535)映射到右下角, 这一点一定要注意, 我在这里就吃过亏, 我先前是直接将坐标传入, 没有进行一个转化.
  转化的方法, 如果是800 * 480分辨率

  int x = 300;int y = 300;int dx = x * 65535 / 800;int dy = y * 65535 / 480;


可能上面代码中有些常量定义值找不到, 这里就给出了(造福使用C#的小伙伴们, 我也是一个使用C#的可怜家伙.)

	const int MOUSEEVENTF_MOVE 		= 0x0001;      //移动鼠标 const int MOUSEEVENTF_LEFTDOWN 		= 0x0002; 	//模拟鼠标左键按下 const int MOUSEEVENTF_LEFTUP 		= 0x0004; 	//模拟鼠标左键抬起 const int MOUSEEVENTF_RIGHTDOWN 	= 0x0008; 	//模拟鼠标右键按下 const int MOUSEEVENTF_RIGHTUP 		= 0x0010; 	//模拟鼠标右键抬起 const int MOUSEEVENTF_MIDDLEDOWN 	= 0x0020; 	//模拟鼠标中键按下 const int MOUSEEVENTF_MIDDLEUP 		= 0x0040; 	//模拟鼠标中键抬起 const int MOUSEEVENTF_ABSOLUTE 		= 0x8000; 	//标示是否采用绝对坐标 const int MOUSEEVENTF_TOUCH 		= 0x100000;

写下此文的目的是给有同样有需求的人以启发. 我会告诉你我花了一天时间来实现CE下模拟鼠标点击吗?


参考资料:


本文标签: WINCE下模拟鼠标点击 移动