• 用C++Builder开发自己的RDP客户端


    用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:alxter@foxmail.com

        原创作品,转贴请注明出处!!

  • 相关阅读:
    Python 函数 -range()
    Python 函数 -xrange()
    Python 函数 -globals()
    Python 函数-max()
    Python 函数 -hasattr()
    Python 函数 memoryview()
    Python函数 hash()
    QAQ
    Õ() Big-O-notation
    一道有趣的条件概率题
  • 原文地址:https://www.cnblogs.com/cpprun/p/2660748.html
Copyright © 2020-2023  润新知