0

Windows デスクトップ共有アプリを作成していますが、チャット メッセージを送信するための仮想チャネル以外はすべて機能しています。ホストからビューアーにメッセージを送信できますが、その逆はできません。Viewer は ActiveX RDPViewer を使用しています。問題は、ホストで OnChannelDataRecieved イベントを発生させることができないことです。以前にこれで問題を抱えた人がいることは知っていますが、助けていただければ幸いです。

ここに役立つかもしれないいくつかのスニペットがあります。ビューアー

RDPCOMAPILib.IRDPSRAPIVirtualChannel chan;
chan = rdpViewer.VirtualChannelManager.CreateVirtualChannel(name, RDPCOMAPILib.CHANNEL_PRIORITY.CHANNEL_PRIORITY_HI, 0);

次に、送信するときに電話します

chan.SendData(message, (int)RDPCOMAPILib.RDPENCOMAPI_CONSTANTS.CONST_ATTENDEE_ID_HOST, 0);

ホスト

chan = rdp.VirtualChannelManager.CreateVirtualChannel(name, RDPCOMAPILib.CHANNEL_PRIORITY.CHANNEL_PRIORITY_HI, 0);
foreach(IRDPSRAPIAttendee attendee in rdp.Attendees)
            this.vc.SetAccess(attendee.Id, RDPCOMAPILib.CHANNEL_ACCESS_ENUM.CHANNEL_ACCESS_ENUM_SENDRECEIVE);

次に、これを呼び出してデータを送信します

chan.SendData(message, (int)RDPCOMAPILib.RDPENCOMAPI_CONSTANTS.CONST_ATTENDEE_ID_EVERYONE, 0);
4

2 に答える 2

2

これが私のニーズにうまく機能する私が使用するテクニックです:

//----------------------------------------------------------------------------------------
// On the server/host, create a new session
//----------------------------------------------------------------------------------------
RDPSession session = new RDPSession();

// Then create a virtual channel
IRDPSRAPIVirtualChannel virtualChannel1 = session.VirtualChannelManager.CreateVirtualChannel("foo", CHANNEL_PRIORITY.CHANNEL_PRIORITY_HI, (uint)CHANNEL_FLAGS.CHANNEL_FLAGS_LEGACY);

// Now open the session
session.Open()

// And connect to the received event
session.OnChannelDataReceived += new _IRDPSessionEvents_OnChannelDataReceivedEventHandler(OnChannelDataReceived);

private void OnChannelDataReceived(object pChannel, int lAttendeeId, string bstrData) {
    Debug.WriteLine("Server::OnChannelDataReceived" + bstrData.Trim());
}

//----------------------------------------------------------------------------------------
// On the Client/Viewer side.
//----------------------------------------------------------------------------------------

// AxRDPViewer is the RDPViewer control on your form. Connect using the appropriate criteria.
AxRDPViewer.Connect(strInvitation, strName, strPassword);

// "Bind" the virtual channel by creating one using the same name as the one created on
// the server side.
IRDPSRAPIVirtualChannel virtualChannel1 = RDPViewer.VirtualChannelManager.CreateVirtualChannel("foo", CHANNEL_PRIORITY.CHANNEL_PRIORITY_HI, (uint)CHANNEL_FLAGS.CHANNEL_FLAGS_LEGACY);

// Hook the data received event
RDPViewer.OnChannelDataReceived += new AxRDPCOMAPILib._IRDPSessionEvents_OnChannelDataReceivedEventHandler(RDPViewer_OnChannelDataReceived);

private void RDPViewer_OnChannelDataReceived(object sender, AxRDPCOMAPILib._IRDPSessionEvents_OnChannelDataReceivedEvent e) {
    Debug.WriteLine("Client::OnChannelDataReceived:" + e.bstrData.Trim());
}

//----------------------------------------------------------------------------------------
// Sending data
//----------------------------------------------------------------------------------------

// Now, on both the server and client side, you can send data like this:

virtualChannel1.SendData("yippie!", (int)RDPENCOMAPI_CONSTANTS.CONST_ATTENDEE_ID_EVERYONE, (uint)CHANNEL_FLAGS.CHANNEL_FLAGS_LEGACY);

それが役立つことを願っています。私は実際にしばらくこれに苦労しましたが、最終的には、セッション イベントのフックを担当するフォーム上でモーダル ダイアログを起動していることに気付きました。だから、それをしないでください。;)

于 2012-03-14T19:09:56.853 に答える
1

使用RDPENCOMAPI_CONSTANTS.CONST_ATTENDEE_ID_EVERYONEしてもうまくいきませんでした。その問題を解決する唯一の方法はSendData、セッションの出席者を反復処理することでした。

foreach (IRDPSRAPIAttendee a in _ctx.activeSession.Attendees)
    virtualChannel.SendData(msg, a.Id, Convert.ToUInt32(CHANNEL_FLAGS.CHANNEL_FLAGS_LEGACY));

RDPENCOMAPI_CONSTANTS.CONST_ATTENDEE_ID_HOSTこれでホストからビューアへの通信は解決されますが、同じ仮想チャネルに登録され、定数を使用している、接続されたビューアからメッセージを受信できません。

私がサーバー側で行ったことは、新しい RDPSession と仮想チャネルを作成することです

activeSession = new RDPSession();
virtualChannel = activeSession.VirtualChannelManager.CreateVirtualChannel("myproto", CHANNEL_PRIORITY.CHANNEL_PRIORITY_HI, (uint)CHANNEL_FLAGS.CHANNEL_FLAGS_LEGACY);

イベントの新しいハンドラーを作成しOnChannelDataReceived、RDP セッションを開始します。

activeSession.OnChannelDataReceived += new _IRDPSessionEvents_OnChannelDataReceivedEventHandler(OnChannelDataReceived);
activeSession.Open();

イベント ハンドラーは次のようになります。

    private void OnChannelDataReceived(object pChannel, int lAttendeeId, string bstrData) {
       switch(bstrData) 
       {
            /* Handle commands here */
            case "mycmd":
                /* Process command and reply using SendData */
                break;

       }
    }

rdpcomen.dllビューアーは Windows 10 で実行され、サーバーは Windows 7 で実行され、どちらもツールを使用して Windows 7 から生成された RDPCOMAPIを使用しtlbimp.exeます。

于 2018-09-18T15:27:20.587 に答える