自己写远程控制软件之键鼠响应

上一篇说图像压缩和显示的时候,大家已经看到了在客户端的捕捉键鼠消息的代码,这里就直接说在服务器的实现了。

代码其实很简单但是需要注意的是,在网络接收消息后,不要在网络回调里,直接 mouse_event或者keybd_event 做其它事情也不行,除了缓冲区取一个缓冲区,然后 Post 到 IOCP 以外,否则,轻则影响效率,重则死锁当然接收的数据还是要处理的,用的是线程池函数 QueueUserWorkItem,你懂的。不过,QueueUserWorkItem 有时,有点问题(有时有 .Net 程序运行的时候,CPU 很高,原因不明,可能是要和 .Net 强线程吧),不过,我有仿 QueueUserWorkItem 的函数,可以避免这个问题,这里就不说了

DWORD WINAPI RunCommand(LPVOID lpParam)
{
	SOCKET_POST_CTRL *pRecv = (SOCKET_POST_CTRL *) lpParam;
	switch (pRecv->remoteCtrl.dwCtrl) {
		case CTRL_MOUSE:
			SetCursorPos(pRecv->remoteCtrl.x * GetSystemMetrics(SM_CXSCREEN) / pRecv->remoteCtrl.dwWidth, 
						 pRecv->remoteCtrl.y * GetSystemMetrics(SM_CYSCREEN) / pRecv->remoteCtrl.dwHeight);

			mouse_event(pRecv->remoteCtrl.dwFlags, 0, 0, 0, 0);
			break;
		case CTRL_KEYBOARD:
			::keybd_event((BYTE) pRecv->remoteCtrl.nChar, (BYTE) pRecv->remoteCtrl.nChar, pRecv->remoteCtrl.nFlags, 0);
			break;
		default:
			break;
	}
	SQ_PushBack(pRecv->hQueue, ForceCast<DWORD>(pRecv));
	return 0;
}


VOID OnRecv(SOCKET_POST *pPost)
{
	SOCKET_POST_CTRL *pRecv = (SOCKET_POST_CTRL *) pPost;
	if (pRecv->dwBytesTrans == 0) {
		IOCP_Close(pRecv->pInfo);
		SQ_PushBack(pRecv->hQueue, ForceCast<DWORD>(pRecv));
	}
	else {
		pRecv->dwLeftSize -= pRecv->dwBytesTrans;
		if (pRecv->dwLeftSize > 0) {
			pRecv->pWSABuf		= &(pRecv->wsaBuf[0]);
			pRecv->dwBufCount	= ItemCount(pRecv->wsaBuf);
			pRecv->wsaBuf[0].len= pRecv->dwLeftSize;
			pRecv->wsaBuf[0].buf= (PCHAR) &(pRecv->pktHead);
			pRecv->wsaBuf[0].buf+= (sizeof(pRecv->pktHead) + sizeof(pRecv->remoteCtrl) - pRecv->dwLeftSize);

			IOCP_PostRecv(m_hIOCP, pRecv->pInfo, pRecv);
		}
		else {
			switch (pRecv->pktHead.dwStamp) {
				case STAMP_PACKET:
					QueueUserWorkItem(RunCommand, pRecv, 0);
					SQ_PopFront(m_hQueueRecv, ForceCast<LPDWORD>(&pRecv));
					PostRecv(m_pInfo, pRecv);
					break;
				default:
					IOCP_Close(pRecv->pInfo);
					SQ_PushBack(pRecv->hQueue, ForceCast<DWORD>(pRecv));
					break;
			}
		}
	}
}



当你有多台电脑的键盘标放在狭窄的电脑桌上, 当你在每台电脑的键盘标之间来回切换而焦头烂额时, 当你为了发送一段文本而不得不使用飞鸽或QQ甚至通过共享文件来时传递时, 你或许需要它:"远程虚拟控制" 这个软件实现了只使用一套键盘控制最多八台主机的功能, 并能在这些主机之间方便的传送文本内容, 实现在一台电脑上Ctrl + C 在另外一台电脑上Ctrl + V, 完成远程复制功能。 主机之间的切换无需进行任何附加操作, 你只需要将你的标从这个显示移动到另一台显示器, 就如同将输入焦点从一个窗口移动到另一个窗口一样, 当完成标切换后, 键盘也同时将输入焦点切换到相应的主机, 此后的大部分键盘输入操作均只对拥有标的主机有效, 除了(Ctrl + ATL + DEL、WIN + L)这些组合键无法传送, 当按下这些组合键后, 主控机即刻获取输入焦点。 此软件只能在登陆后的默认桌面才可使用, 不能在登陆桌面, 屏保桌面下使用(等待解决这个问题), 在使用时如果系统安装有防火墙软件, 请将本程序加入防火墙的白名单或是相应配制文件中, 让防火墙放过检测。否则可能 给你的使用带来不便。 软件分为主控端和被控端, 可能存在多台被控端, 但是只能有一台主控端, 由主控端向其它被控端发送键盘标指令, 以控制被控端的行为。 将程序分别解压到你每台的电脑上,依据配制说明将一台电脑配制成主控机, 将其它的电脑制成被控机。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值