★米老鼠★问题之六:鼠标传送以及远程操作的问题★

GaoLun 2003-09-24 11:06:45
相信很多人都用过WinVNC或者是PCAnyWhere等远程控制软件,现在要实现的功能是和NetMeeting中的桌面共享那个功能差不多,不过不要那么全面。
问题:
1:传送屏幕很简单,可是问题是如何把被操作方机器的鼠标也传送过来以及如何控制被操作方的鼠标。
2:发送消息也不难,可是如何把操作方的按键消息也传到被操作方,例如:被操作方开一个写字板,操作方输入字符(如果是英文也罢)可是如果有中文如何判断输入法。


希望各位能不吝赐教,谢谢!
...全文
72 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
GaoLun 2003-09-24
  • 打赏
  • 举报
回复
VNC的源码对于我这个 菜菜的老鼠来说是有点太难了!
GaoLun 2003-09-24
  • 打赏
  • 举报
回复
to 姜春,不要想歪了!
如果是你的想的那样的话,我还不如直接用上边我列出来的软件算了
猛禽 2003-09-24
  • 打赏
  • 举报
回复
要控制鼠标和键盘啊,写HOOK吧,VNC有源码
Atomictry 2003-09-24
  • 打赏
  • 举报
回复
米大点的老鼠,你没力气我帮你顶。
jiangchun_xn 2003-09-24
  • 打赏
  • 举报
回复
高论,你是不是想。。。。。。

我提个设想:

用狗字截获鼠标消息,然后传送到这边,在把他回放到字的现实屏幕上,有些消息可能要做一些修改,不知道这样行不行。如果不行,估计就只能判断后使用mouse_event了。控制就是反过来。



chifengwatch 2003-09-24
  • 打赏
  • 举报
回复
up
yuyulily 2003-09-24
  • 打赏
  • 举报
回复
mark
BCBChina 2003-09-24
  • 打赏
  • 举报
回复
up
cident 2003-09-24
  • 打赏
  • 举报
回复
网上有类似代码的。 www.vckbase.com去看看。
binbin 2003-09-24
  • 打赏
  • 举报
回复
不知道用日志钩子这个想法是否可行。好象本身就是用来记录和回放鼠标、键盘动作的。
binbin 2003-09-24
  • 打赏
  • 举报
回复
keybd_event和mouse_event属于不推荐使用的函数了,请使用SendInput
duduwolf 2003-09-24
  • 打赏
  • 举报
回复
置于被控端的鼠标消息和键盘消息的截获就用钩子了,传送后的处理就和上面发的被控端的道理一样。

还有,提个意见,不要老用被操作方,老是看成 被操.. 感觉怪怪的:)
改成控制端和被控端

duduwolf 2003-09-24
  • 打赏
  • 举报
回复
我先帮你搞定控制被控方的鼠标吧!

控制端将回传回来的屏幕内容显示在一个Image1中,一下是将image1中的鼠标消息处理
void __fastcall TFrmFull::Image1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
if(FrmMain->CheckBox3->Checked)
{
char text[32];
int Rx,Ry;
/*Rx=X*R_Width/Image1->Width;
Ry=Y*R_Height/Image1->Height;*/
Rx=X*65535/Image1->Width;
Ry=Y*65535/Image1->Height;
sprintf(text,"Mouse Pos:(%d,%d)",Rx,Ry);
//StatusBar1->Panels->Items[1]->Text=text;
sprintf(text,"3\n1\n%d\n%d\n",Rx,Ry);
int sock=Connect_Server(RemoteAddress, LISTENPORT);
Write_Socket(sock, text);
closesocket(sock);
}

}
//---------------------------------------------------------------------------

void __fastcall TFrmFull::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(FrmMain->CheckBox3->Checked)
{
char text[32];
int Rx,Ry;
Rx=X*65535/Image1->Width;
Ry=Y*65535/Image1->Height;
switch(Button)
{
case mbLeft:
sprintf(text,"3\n2\n%d\n%d\n",Rx,Ry);
break;
case mbRight:
sprintf(text,"3\n4\n%d\n%d\n",Rx,Ry);
break;
case mbMiddle:
sprintf(text,"3\n6\n%d\n%d\n",Rx,Ry);
break;

}
int sock=Connect_Server(RemoteAddress, LISTENPORT);
Write_Socket(sock, text);
closesocket(sock);
}
}
//---------------------------------------------------------------------------

void __fastcall TFrmFull::Image1MouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(FrmMain->CheckBox3->Checked)
{
char text[32];
int Rx,Ry;
Rx=X*65535/Image1->Width;
Ry=Y*65535/Image1->Height;
switch(Button)
{
case mbLeft:
sprintf(text,"3\n3\n%d\n%d\n",Rx,Ry);
break;
case mbRight:
sprintf(text,"3\n5\n%d\n%d\n",Rx,Ry);
break;
case mbMiddle:
sprintf(text,"3\n7\n%d\n%d\n",Rx,Ry);
break;

}
int sock=Connect_Server(RemoteAddress, LISTENPORT);
Write_Socket(sock, text);
closesocket(sock);
}
}

以下是被控端也就是server端的代码处理:
case 2://请求目标机屏幕分辨率
{
char str[24];
int Width=GetSystemMetrics(SM_CXSCREEN);
int Height=GetSystemMetrics(SM_CYSCREEN);
sprintf(str,"%d*%d\n",Width,Height);
Socket->SendText(str);
}
break;
case 3://
{
int MouseCmd=StrToIntDef(sRecvString.SubString(1,pos-1),0);
sRecvString = sRecvString.SubString(pos+1,sRecvString.Length()-pos);
pos = sRecvString.Pos("\n");
int px=StrToIntDef(sRecvString.SubString(1,pos-1),0);
sRecvString = sRecvString.SubString(pos+1,sRecvString.Length()-pos);
pos = sRecvString.Pos("\n");
int py=StrToIntDef(sRecvString.SubString(1,pos-1),0);
switch(MouseCmd)
{
case 1://WM_MOUSEMOVE
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE,px,py,0,0);
break;
case 2://WM_LBUTTONDOWN
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,px,py,0,0);
break;
case 3://WM_LBUTTONUP
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP,px,py,0,0);
break;
case 4://WM_RBUTTONDOWN
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTDOWN,px,py,0,0);
break;
case 5://WM_RBUTTONUP
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTUP,px,py,0,0);
break;
case 6://WM_MIDBUTTONDOWN
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEDOWN,px,py,0,0);
break;
case 7://WM_MIDBUTTONUP
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEUP,px,py,0,0);
break;

default:
break;
}
}
break;
case 4: //锁鼠
{
Socket->SendText("鼠标成功锁定\n");
bLockButton = true;
LockButton();
//ShowCursor(true);

}
break;
case 5:bLockButton = false; //解鼠
Socket->SendText("鼠标解锁\n");
break;
case 6: //模拟键盘击键
{
//WORD &key=65;
int strCusKey = StrToInt(sRecvString.SubString(1,pos-1));
keybd_event( strCusKey, 0, 0, 0);// press H
keybd_event( strCusKey, 0, KEYEVENTF_KEYUP, 0);
}
break;
case 7: //发送磁盘信息

这个是模仿黄鑫的那个程序作的,我自己
GaoLun 2003-09-24
  • 打赏
  • 举报
回复
帮帮我啊!
纯冰糖 2003-09-24
  • 打赏
  • 举报
回复
我是来学习的
penu 2003-09-24
  • 打赏
  • 举报
回复
TO:老鼠
远程控制软件都有服务器端(也就是被控端)
1、你在服务器端软件开一个线程,定时(500ms或1s)取鼠标信息,并发送至客户端(控制端),客户端收到后在本机上显示出来。
2、客户端软件接收本机mouse信息并传送至服务器端,服务器端收到后做相应动作。
3、对于键盘操作监控与鼠标类似(见1、2),定时取缓冲区即可。
4、对于输入内容,接收端收到数据后判断是否是ASCII码,不是则两字节合并即可。

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧