In my WinSharer Application, private void OnAttendeeConnected(object pObjAttendee) { IRDPSRAPIAttendee pAttendee = pObjAttendee as IRDPSRAPIAttendee; pAttendee.ControlLevel = CTRL_LEVEL.CTRL_LEVEL_VIEW; //MessageBox.Show(("Attendee Connected: " + pAttendee.RemoteName + Environment.NewLine)); } void OnAttendeeDisconnected(object pDisconnectInfo) { IRDPSRAPIAttendeeDisconnectInfo pDiscInfo = pDisconnectInfo as IRDPSRAPIAttendeeDisconnectInfo; } void OnControlLevelChangeRequest(object pObjAttendee, CTRL_LEVEL RequestedLevel) { IRDPSRAPIAttendee pAttendee = pObjAttendee as IRDPSRAPIAttendee; pAttendee.ControlLevel = RequestedLevel; } And in the WinViewer, public void ControlDesktop(object sender, EventArgs e) { desktopViewer.RequestControl(RDPCOMAPILib.CTRL_LEVEL.CTRL_LEVEL_INTERACTIVE); } The above is callback when the button ControlDesktop is clicked