捕获鼠标和键盘的原始数据

本文介绍了一种实现局域网内鼠标键盘共享的方法,通过使用RawInput技术捕获主机上的原始输入数据,使多台电脑能共享一套输入设备。文章提供了具体的代码示例,包括注册输入设备和获取鼠标键盘数据的过程。
为了实现局域网内鼠标键盘的共享(比如你同时用两台电脑,这时就希望能共享鼠标和键盘),需要获得主机的鼠标键盘原始信息,下面的demo演示了如何获得主机的鼠标键盘原始数据。程序运行后无论是否获得焦点,都能够得到鼠标键盘数据。

实现的关键是使用了RawInput,使用过程是先注册需要捕获的设备,然后在DefWindowProc函数中截取所需的数据。

其中注册鼠标键盘设备的代码放在一个按钮的响应函数中:

void CRawInputDlg::OnButton1() 
{
	RAWINPUTDEVICE Rid[2];
        
	Rid[0].usUsagePage = 0x01; 
	Rid[0].usUsage = 0x02; 
	Rid[0].dwFlags = RIDEV_INPUTSINK;   // adds HID mouse and also ignores legacy mouse messages   RIDEV_NOLEGACY RIDEV_INPUTSINK
	Rid[0].hwndTarget = m_hWnd;

	Rid[1].usUsagePage = 0x01; 
	Rid[1].usUsage = 0x06; 
	Rid[1].dwFlags = RIDEV_INPUTSINK;   // adds HID keyboard and also ignores legacy keyboard messages RIDEV_NOLEGACY RIDEV_INPUTSINK
	Rid[1].hwndTarget = m_hWnd;

	if (RegisterRawInputDevices(Rid, 2, sizeof(Rid[0])) == FALSE) {
		//registration failed. Call GetLastError for the cause of the error
		MessageBox("错误的注册信息");
	}


}

数据捕获:

LRESULT CRawInputDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	// TODO: Add your specialized code here and/or call the base class
	if ( message == WM_INPUT )
	{
		UINT dwSize=0;
		GetRawInputData(
			(HRAWINPUT)lParam,
			(UINT)RID_INPUT,
			(LPVOID)NULL,
			(PUINT)	&dwSize,
			(UINT)sizeof(RAWINPUTHEADER)
		);

		LPBYTE lpbBuffer = new BYTE[dwSize];

		GetRawInputData(      
			(HRAWINPUT)lParam,
			(UINT)RID_INPUT,
			(LPVOID)lpbBuffer,
			(PUINT)&dwSize,
			(UINT)sizeof(RAWINPUTHEADER)
		);

		RAWINPUT * raw = (RAWINPUT *) lpbBuffer;

		CString strTemp;

		tmTime=CTime::GetCurrentTime();
		CString strT;
		strT=tmTime.Format("%H:%M:%S");

		if (raw->header.dwType == RIM_TYPEMOUSE)
		{
			strTemp.Format(" 鼠标: BtnState=%04x deltaX=%d deltaY=%d\r\n", 
            raw->data.mouse.ulButtons, 
            raw->data.mouse.lLastX, 
            raw->data.mouse.lLastY
			);

			strTemp=strT+strTemp;
			DisplayData(strTemp);

			delete[] lpbBuffer;

			return TRUE;
		}
		else if(raw->header.dwType == RIM_TYPEKEYBOARD){
			strTemp.Format(" 键盘:make=%04x Flags:%04x msg=%04x VK=%c", 
            raw->data.keyboard.MakeCode, 
            raw->data.keyboard.Flags, 
            raw->data.keyboard.Message, 
            raw->data.keyboard.VKey
			);

			strTemp=strT+strTemp;
			DisplayData(strTemp);

			delete[] lpbBuffer;

			return TRUE;
		}
	}
	return CDialog::DefWindowProc(message, wParam, lParam);
}

运行效果


参考资料:

http://bbs.youkuaiyun.com/topics/330017277

Using Raw Input
http://msdn.microsoft.com/en-us/library/ms645546(v=vs.85).aspx
Using Mouse Input
msdn.microsoft.com/en-us/library/ms645602(v=vs.85).aspx
About Raw Input
http://msdn.microsoft.com/en-us/library/ms645543(v=vs.85).aspx




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值