怎样用VC++实现远程控制?

zeroyoyo 2000-08-25 11:27:00
怎样实现一台计算机(server)对另一台计算机(client)的控制?
想通过主机向客户机发送鼠标、键盘消息的方式,当客户机接收到消息后,
怎样通过客户端的程序来响应这些虚拟的鼠标、键盘消息,即用主机遥控
操作客户机?

具体的解决方法请发E-mail给小弟:
zeroyoyo@263.net
谢谢!
...全文
355 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zeroyoyo 2000-08-28
  • 打赏
  • 举报
回复
谢谢sinsky 和其他各位大侠:
络传输方面已解决,但客户端接收到消息后的处理还望有详细解答.
怎样用sendmessage等函数,向不同的窗口发送消息,使窗口程序做出响应.
以及向windows发送命令,如点击桌面上的图标,打开开始菜单,打开应用
程序,还有击活某个Edit中的光标,进行输入等等.总之,完成主机对客户机
的完全控制,希望提供一些详细的函数,过程,源代码,如能解决,小弟赠120分!
请发E-mail给我: zeroyoyo@263.net 谢谢!
sinsky 2000-08-27
  • 打赏
  • 举报
回复
看看这个,或许对你有帮助。


服务器与客户机互传消息

一、 服 务 器 程 序
创 建 一 个 名 为“server" 的 项 目, 单 文 档 界 面。
在serverview.h 中 加 入 代 码:
#include “winsock.h"
添 加 变 量:
CSize sizeTotal;// 控 制 滚 动 条
int count;// 信 息 条 数
CString m_data[1000];// 信 息 存 放
char Hostname[260];
char Hostaddress[20];// 主 机IP 地 址
SOCKET m_sock;
HANDLE m_hListenThread;// 线 程
BOOL m_bInitialized;// 是 否 初 始 化
WSADATA WSAData;
BOOL flag;
SOCKADDR_IN saClnt;
int saClntLen;
BOOL Isconnect;// 是 否 连 接
在serverview.cpp 中 重 载CServerView() 构 造 器, 创 建 并 绑 定 嵌 套 字:
CServerView::CServerView()
{ // TODO: add construction code here
Isconnect=FALSE;
flag=FALSE;
sizeTotal.cy=350;
sizeTotal.cx=300;
m_hListenThread;
count=5;
int status;
WSADATA wsaData;
m_data[0]=“initializing Windows Sockets DLL....";
if((status=WSAStartup(0x0101, &wsaData))==0)
{ m_data[0] +=“Succeeded";
m_bInitialized=TRUE;
}
else
{ m_bInitialized=FALSE;
}
m_sock=socket(AF_INET,SOCK_DGRAM,0);
m_data[1]=“Creating socket....";
if(m_sock==INVALID_SOCKET)
{ m_data[1] +=“Failed";
}
m_data[1] +=“Succeeded";
m_data[2]=“Binding socket....";
sockaddr_in sa;
sa.sin_family=AF_INET;
sa.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
sa.sin_port=htons(5050);
if(bind(m_sock,(PSOCKADDR)
&sa,sizeof(sa))==SOCKET_ERROR)
{ m_data[2] +=“Failed";
closesocket(m_sock);
}
m_data[2] +=“Succeeded";
m_data[3]=“Creating listener thread....";
unsigned long idThread;
m_hListenThread=CreateThread(NULL,0,
(LPTHREAD_START_ROUTINE)Listen,
(void if(m_hListenThread)
{ m_data[3] +=“Succeeded";
m_data[4] +=“Listening....";
}
else
m_data[4] +=“Failed";
}
在 析 构 函 数 中 完 成 必 需 的 清 除 操 作:
CServerView:: ~CServerView()
{ if(m_bInitialized)
WSACleanup();
closesocket(m_sock);
if(m_hListenThread)
::TerminateThread(m_hListenThread,0);
}
定 义 接 收 和 处 理 消 息 的 线 程:
long WINAPI Listen(CServerView *pView)
{ char msg[2000]=“";
int nchar;
SOCKADDR_IN saClnt;
int saClntLen;
while(1)
{ saClntLen=sizeof(saClnt);
nchar=recvfrom(pView ->m_sock,msg,1024,0,
(PSOCKADDR) &saClnt, &saClntLen);
if(nchar<0)
{ pView ->m_data[pView ->count + +] +
=“Error in recvfrom\n";
pView ->InvalidateRect(NULL);
}
else
{switch(msg[0])
{
case ‘A':
wsprintf(msg,“A:Client from %s attached\n",
inet_ntoa(saClnt.sin_addr));
pView ->m_data[pView ->count + +]=msg;
pView ->flag=TRUE;
pView ->InvalidateRect(NULL);
pView ->Isconnect=TRUE;
pView ->saClnt=saClnt;
pView ->saClntLen=saClntLen;
sendto(pView ->m_sock,msg,1024,0,(PSOCKADDR)
&saClnt,saClntLen);
break;

case ‘D':
wsprintf(msg,“D: Client form %s detached\n",
inet_ntoa(saClnt.sin_addr));
pView ->m_data[pView ->count + +]=msg;
pView ->flag=TRUE;
pView ->InvalidateRect(NULL);
pView ->Isconnect=FALSE;
sendto(pView ->m_sock,msg,1024,0,(PSOCKADDR)
&saClnt,saClntLen);
break;
case ‘R':
saClntLen=sizeof(saClnt);
pView ->m_data[pView ->count + +]=msg;
pView ->flag=TRUE;
pView ->InvalidateRect(NULL);
break;
default:
break;
}
}

}
return(0);
}
在 程 序 菜 单 项 中 添 加“ 本 机IP 地 址":
   void CServerView::OnIp()
{int WSAReturn;
WSAReturn=WSAStartup( 0x0101, &WSAData );
if( WSAReturn == 0 ){
gethostname( Hostname, 260 );
struct hostent *pHostEnt;
pHostEnt = gethostbyname( Hostname);
if( pHostEnt != NULL ){
wsprintf( Hostaddress, “ %d. %d. %d. %d",
( pHostEnt ->h_addr_list[0][0] & 0x00ff ),
( pHostEnt ->h_addr_list[0][1] & 0x00ff ),
( pHostEnt ->h_addr_list[0][2] & 0x00ff ),
( pHostEnt ->h_addr_list[0][3] & 0x00ff ) );
   CString out;
   out.Format(Hostaddress);
   AfxMessageBox(out);
   }
}
}
在 程 序 菜 单 中 添 加“ 发 送 消 息":
   void CServerView::OnSendmessage()
{// TODO: Add your command handler code here
char msg[2000];
Csend Sendmessage;
if(Sendmessage.DoModal()==IDOK
& &!Sendmessage.m_Message.IsEmpty())
   { wsprintf(msg,“R: " +Sendmessage.m_Message);
   sendto(m_sock,msg,1024,0,(PSOCKADDR)
&saClnt,saClntLen);
   m_data[count + +]=Sendmessage.m_Message;
   flag=TRUE;
   InvalidateRect(NULL);
   }
}
为 发 送 消 息 项 添 加 一 个 对 话 框 的 类, 名 为send, 有 一 个 文 本 框, 用 来 发 送 消 息, 并
为 文 本 框 添 加CString m_Message 变 量, 在ServerView.cpp 中 添 加 #include “send.h"
为 发 送 消 息 项 添 加 一 个 判 断 函 数:
void CServerView::OnUpdateSendmessage(CCmdUI *
pCmdUI)
{// TODO: Add your command update UI handler code here
pCmdUI ->Enable(FALSE);
if(Isconnect)
pCmdUI ->Enable(TRUE);
}
再 窗 口 显 示 消 息:
void CServerView::OnDraw(CDC * pDC)
{ if(flag)
{sizeTotal.cy +=20;
for(int j=65;jTextOut(10,y,m_data[i]);
y +=20;}
// TODO: add draw code for native data here
}
在Project 中 点 击Settings 中 选 择Link 项 添 加wsock32.lib。
----最 后 编 译 程 序, 就 可 以 得 到Server.exe 程 序。
二、 客 户 机 程 序
创 建 一 个 名 为“client" 的 项 目, 单 文 档 界 面。
在clientview.h 中 加 入 代 码:
#include “winsock.h"
添 加 变 量:
CString m_data[1000];
HANDLE m_hListenThread;
SOCKET m_sock;
SOCKADDR_IN m_saSrvr;
BOOL Isconnect;
int count;
CSize sizeTotal;
BOOL flag;
在 构 造 函 数 中 初 始 化 变 量:
CClientView::CClientView()
{ // TODO: add construction code here
Isconnect=FALSE;
sizeTotal.cy=350;
sizeTotal.cx=300;
flag=FALSE;
}
在 析 构 函 数 中 完 成 清 除 操 作, 代 码 如 上。
在 菜 单 中 添 加“ 拨 号" 项:
void CClientView::OnDial()
{// TODO: Add your command handler code here
count=5;
if(m_bInitialized)
{ AfxMessageBox(“Already dialing");
return;}
Cdial dial;
if(dial.DoModal()==IDOK
& &!dial.m_HostAddress.IsEmpty())
{m_saSrvr.sin_family=AF_INET;
m_saSrvr.sin_addr.S_un.S_addr=htonl
(INADDR_ANY);
m_saSrvr.sin_addr.S_un.S_addr=inet_addr
(dial.m_HostAddress);
m_saSrvr.sin_port=htons(5050);
int status;
WSADATA wsaData;
m_data[0]=“initializing Windows Sockets DLL....";
if((status=WSAStartup(0x0101, &wsaData))==0)
{ m_data[0] +=“Succeeded";
m_bInitialized=TRUE;}
else
{ m_bInitialized=FALSE;}
m_sock=socket(AF_INET,SOCK_DGRAM,0);
m_data[1]=“Creating socket....";
if(m_sock==INVALID_SOCKET)
{ m_data[1] +=“Failed";}
m_data[1] +=“Succeeded";
m_data[2]=“Binding socket....";
sockaddr_in sa;
sa.sin_family=AF_INET;
sa.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
sa.sin_port=htons(0);
if(bind(m_sock,(PSOCKADDR)
&sa,sizeof(sa))==SOCKET_ERROR)
{ m_data[2] +=“Failed";
closesocket(m_sock);}
m_data[2] +=“Succeeded";
m_data[3]=“Creating listener thread....";
unsigned long idThread;
m_hListenThread=CreateThread(NULL 0,
(LPTHREAD_START_ROUTINE)Listen,
(void *)this,0, &idThread);
if(m_hListenThread)
{ m_data[3] +=“Succeeded";
m_data[4] +=“Waiting....";}
else
m_data[4] +=“Failed";
InvalidateRect(NULL);
}
}
添 加 一 个 拨 号 对 话 框, 名 为dial, 有 一 个 文 本 框 用 来 写IP 地 址. 并 在clientview.cpp 中
添 加 代 码:
#include dial.h
在 拨 号 项 添 加 一 个 判 断 函 数:
void CClientView::OnUpdateDial(CCmdUI *
pCmdUI)
{// TODO: Add your command update UI handler code here
pCmdUI ->Enable(TRUE);
if(Isconnect)
pCmdUI ->Enable(FALSE);
}
添 加 接 收 与 发 送 消 息 的 线 程:
long WINAPI Listen(CClientView *pView)
{ char msg[2000];
pView ->m_data[5]=“Sending ATTACH command";
pView ->InvalidateRect(NULL);
wsprintf(msg,“A: ");
sendto(pView ->m_sock,msg,1024,0,(PSOCKADDR)
&pView ->m_saSrvr,sizeof(pView ->m_saSrvr));
int saSrvrLen ,nchar;
while(1)
{saSrvrLen=sizeof(pView ->m_saSrvr);
nchar=recvfrom(pView ->m_sock,msg,1024,0,
(PSOCKADDR) &pView ->m_saSrvr, &saSrvrLen);
if(nchar<0)
{ pView ->m_data[pView ->count + +]=
“Error in recvform";
pView ->InvalidateRect(NULL);}
else
{ pView ->m_data[pView ->count + +]=msg;
pView ->Isconnect=TRUE;
pView ->flag=TRUE;
pView ->InvalidateRect(NULL);
}
}
return(0);
}
同 主 程 序 一 样 做 一 个 发 送 消 息 项, 代 码 如 上。
显 示 程 序 也 与 主 程 序 一 样, 代 码 如 上。
在Project 中 点 击Settings 中 选 择Link 项 添 加wsock32.lib。
编 译 程 序 便 可 得 到client.exe 程 序。
----server.exe 和 client.exe 做 完 后, 就 可 以 在 具 有 TCP/IP 协 议 下 的 网 络 中 执 行。
zzh 2000-08-27
  • 打赏
  • 举报
回复
这里面主要是通过SOCKET来进行通讯控制的。你先定义一些通讯协议,然后再从服务端发送一些控制指令,当客户端收到这些指令后再执行相应的操作就可以了。实际上,具体实现的代码还是比较简单的,看你要实现的功能了。
U皮特U 2000-08-25
  • 打赏
  • 举报
回复
学习一下BO2000的源码不就行了?!网上到处都是。

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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