用C++Builder开发自己的RDP客户端
关键字: C++Builder bcb Rdp客户端 远程桌面连接 连接到控制台
大家都知道用微软提供的远程桌面工具连接到远程桌面,但是可不可以在自己写的程序中嵌入远程桌面呢?当然可以。下面将一步一步的教你如何使用mstscax控件开发自己的远程桌面客户端。 我用的是C++builder6.0,如果你用的其它的开发工具,方法应该是类似的。
一、打开C++builder6.0,选择Component 菜单下的Import ActiveX Control…。然后按下图所示选择Microsoft Terminal Service Control Type Library[Version 1.0]。然后点击install…
然后在弹出的窗口中点击Compile,不过在编译的过程中会出错,解决的方法是把OlePrecedure 改为OleProcedure,再次编译。编译成功之后点击install。好啦~到现在为止环境就搭建好了。
二、重新打开C++builder,新建一个Windows项目。在ActiveX面板中找到
TMsRdpClient2NotSafeForScripting控件,把他添加到界面中去。同时再增加几个辅助控件,效果如下:
三、现在编写代码
//连接
void __fastcall TForm1::btnConnectClick(TObject *Sender)
{
RdpClient->Server=WideString(edtIP->Text);
RdpClient->UserName=WideString(edtUsername->Text);
RdpClient->AdvancedSettings2->ClearTextPassword=WideString(edtPwd->Text);
RdpClient->AdvancedSettings2->set_RDPPort(edtPort->Text.ToInt());
RdpClient->Connect();
Timer1->Enabled=true;
btnConnect->Enabled=false;
btnDisconnect->Enabled=true;
}
//---------------------------------------------------------------------------
//断开
void __fastcall TForm1::btnDisconnectClick(TObject *Sender)
{
RdpClient->Disconnect();
Timer1->Enabled=false;
btnConnect->Enabled=true;
btnDisconnect->Enabled=false;
}
//Timer1的Timer事件
由于mstscax控件在BCB上应用存在一个Bug,就是RdpClient不能自动获得焦点,表现为连上之后如果RdpClient失去焦点,再次获得焦点时RdpClient将没有响应,和死机效果一样(不一定每次都出现)。这时我们需要手动设置焦点。
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
static bool moveInRdp=true;
if(!RdpClient->Connected)
{
btnConnect->Enabled=true;
btnDisconnect->Enabled=false;
Timer1->Enabled=false;
}
TPoint pos = RdpClient->ScreenToClient(Mouse->CursorPos);
if(pos.x>0 && pos.x<RdpClient->Width && pos.y>0 && pos.y < RdpClient->Height)
{
if(moveInRdp && RdpClient->Connected)
{
moveInRdp = false;
edtIP->SetFocus();
RdpClient->SetFocus();
}
}
else
{
moveInRdp=true;
}
}
四、好啦,来看一下效果
好了,到现在为止开发自己的远程桌面连接客户端已经完成了。
五、连接到控制台
可能大家会注意到界面上多了一个连接到控制台的复选按钮“连接到控制台”,这个是什么意思呢?首先要明白什么叫连接到控制台。假如有两个用户用同一个用户名进行登录时,服务器实际上开的是两个会话,两边会话互不影响(只针对显示画面),但如果你要限制只能使用一个会话时就要使用连接到控制台(不止这一点功能,其它的希望自己去测试)。现在说明如何在程序中实现这项功能。在连接按钮的单击事件中添加如下代码:
windows xp sp2:
if (chkConnectToConsole->Checked)
{
RdpClient->AdvancedSettings2->ConnectToServerConsole=VARIANT_TRUE;
}
else
{
RdpClient->AdvancedSettings2->ConnectToServerConsole=VARIANT_FALSE;
}
windows xp Sp3 及更高windwos版本
注意:这里RdpClient是TMsRdpClient6NotSafeForScripting类的对象
if (chkConnectToConsole->Checked)
{
RdpClient->AdvancedSettings7->ConnectToAdministerServer = VARIANT_TRUE;
}
else
{
RdpClient->AdvancedSettings7->ConnectToAdministerServer = VARIANT_FALSE;
}
如果要兼容Sp2与Sp3的windows xp,可以先用TMsRdpClient2NotSafeForScripting对象:
if(RdpClient->AdvancedSettings2->get_ConnectToServerConsole()!=-1) //证明已经升级为SP3
{
使用TMsRdpClient6NotSafeForScripting类
}
else
{
使用TMsRdpClient2NotSafeForScripting类
}
好了,完了。如果大家在过程中有什么问题希望与我取得联系。
qq:155377810 mail:[email protected]
原创作品,转贴请注明出处!!