How to custom the conference UI

I would like to display the control buttons and the zoom conference screen in the same window.
Can I implement the application screen like the attached figure?


I am glad if you would reply.

Relate topic posted by me : https://support.zoom.us/hc/en-us/community/posts/360033974771-How-to-call-a-meeting-without-a-new-window-

Yes. You can do that once you use the custom UI interfaces of the ZOOM SDK.

The following steps are the normal flow to use custom UI features:
a. call CreateCustomizedUIMgr() to create the UI manager
b. create a window which will contain the video contrainer created by step 3
c. create a video container by calling ICustomizedUIMgr::CreateVideoContainer()
d. create one or more video elements by calling IVideoRenderElement::CreateVideoElement()

For more details, please refer to the sdk demo.

Regards,
Wilmer

Thank you for your reply and detail information.
I implemented the calling of CreateVideoContainer. It succeeded. Thank you so much.
ICustomizedUIMgr::CreateVideoContainer(<my application window handler>, <expected screen position>)

Additionally, I have a question.
I think that “Custom UI Feature” cannot be used in Zoom-Windows-Csharp-wrapper. Is it correct?

You are welcome!

Custom UI feature can be used in c# wrapper. Currently, you need to write the wrapper yourself.

Regards,
Wilmer

I’m very sorry for my late reply.

I understood how to use Custom UI feature in C#.
I’ll try to implement the wrapper.

Best regards,
N.H

Hi,

I am able to connect , open and join meeting if i use zoom meeting UI. it works fine for me.
but I am not able to open custom UI, although in case of custom UI aproach I am able to join the meeting.

Here is the approach i am following :
Initialization :
Code snippet for initialization :
ZOOM_SDK_DOTNET_WRAP.InitParam param = new ZOOM_SDK_DOTNET_WRAP.InitParam();
param.web_domain = “https://zoom.us”;
param.config_opts.optionalFeatures = 32;

        ZOOM_SDK_DOTNET_WRAP.SDKError err = ZOOM_SDK_DOTNET_WRAP.CZoomSDKeDotNetWrap.Instance.Initialize(param);

AUTHENTICATION :
Code Snippet for authentication :
ZOOM_SDK_DOTNET_WRAP.CZoomSDKeDotNetWrap.Instance.GetAuthServiceWrap().Add_CB_onAuthenticationReturn(onAuthenticationReturn);

        ZOOM_SDK_DOTNET_WRAP.AuthParam authparam = new ZOOM_SDK_DOTNET_WRAP.AuthParam();

        authparam.appKey = "XXXXXXXX";
        authparam.appSecret = "XXXXXXX";
        ZOOM_SDK_DOTNET_WRAP.CZoomSDKeDotNetWrap.Instance.GetAuthServiceWrap().SDKAuth(authparam);

Meeting status change event : there is one event onMeetingStatusChange, when the meeting status is MEETING_STATUS_INMEETING

Below Code executes :

videocontainer vc = new videocontainer();
RECT t = new RECT
{
Right = 10,
Left = 10,
Bottom = 100,
Top = 10
};
GCHandle handle1 = GCHandle.Alloc(vc);
IntPtr parameter = (IntPtr)handle1;

                    var customUIContainer = ZOOM_SDK_DOTNET_WRAP.CZoomSDKeDotNetWrap.Instance.GetCustomizedUIMgrWrap().CreateVideoContainer(parameter, t);
                    //customUIContainer.
                    customUIContainer.CreateVideoElement(VideoRenderElementType.VideoRenderElement_ACTIVE);
                    customUIContainer.Show();

JOINING Meeting :
Code snippet for the same :
ZOOM_SDK_DOTNET_WRAP.JoinParam joinparam = new ZOOM_SDK_DOTNET_WRAP.JoinParam();
//joinparam.userType = ZOOM_SDK_DOTNET_WRAP.SDKUserType.SDK_UT_APIUSER;
joinparam.userType = ZOOM_SDK_DOTNET_WRAP.SDKUserType.SDK_UT_APIUSER;
ZOOM_SDK_DOTNET_WRAP.JoinParam4APIUser join_api_param = new ZOOM_SDK_DOTNET_WRAP.JoinParam4APIUser();
join_api_param.meetingNumber = 123456789;
join_api_param.userName = “”;
joinparam.apiuserJoin = join_api_param;

        ZOOM_SDK_DOTNET_WRAP.SDKError err = ZOOM_SDK_DOTNET_WRAP.CZoomSDKeDotNetWrap.Instance.GetMeetingServiceWrap().Join(joinparam);
		
		
		
		After following this approacg i am able to join meeting but custom UI provided by zoom is not getting opened.
		Can you please let me know if i am missing something or any problem with my approach.

i found sdk_demo_v2_2017 project solution in which custom UI is getting opened but this project is in .exe form. we need .dll file to be consumed in c# code.
Do I need to write a new wrapper code to implement this and use it in c# as existing wrapper is not working for custom UI functionality.

Hi ankit.acet13,

Thanks for the reply and thanks for providing the code snippet. Yes, since the C# wrapper project is a community project and it does not include all interfaces in the native SDK, after a brief research, we found out that the part for custom UI in the C# wrapper is actually not containing all custom UI interfaces available in the native Windows SDK. Therefore the Custom UI might not work as expected in the C# wrapper.

I have forwarded this to the engineering team and we will add those interfaces in the C# wrapper in the next release. You could also implement the wrapper code if it this urgent. Pardon the inconvenience caused by this.

Hope this helps. Thanks!

thanks for reply. Could you please let me know when your next release is coming up. so that can adjust accordingly.

Hi ankit.acet13,

Thanks for the reply. We are targeting to have a release at the end of this month. Please follow our Github repo for any updates: https://github.com/zoom/zoom-c-sharp-wrapper

Thanks!

Hi @carson.zoom, I’m also experiencing issues with custom UI with the C# wrapper. Here’s my code:
var ui = CZoomSDKeDotNetWrap.Instance.GetCustomizedUIMgrWrap();
var container = ui.CreateVideoContainer(handle, bounds);
var video = container.CreateVideoElement(VideoRenderElementType.VideoRenderElement_ACTIVE);
container.Show();
With this code, I get a plain black area where the video should be, and people on the call can hear me - but I don’t see any video or Zoom UI elements at all. If I add the line:
video.Show();
I get a null reference exception with no helpful details. Am I missing something, or should I wait for the fix?

Hi t.barry-woods,

Thanks for using Zoom SDK. When the element has successfully created, it won’t show upon creation. If this element is an active video element, we have an interface start() and stop() to control https://zoom.github.io/zoom-sdk-windows/class_i_active_video_render_element.html#ac4446616f0d8133d073eca040d986405; Even though this reference for Windows SDK, but the interface name is the same for both Windows SDK and C# wrapper.

Hope this helps. Thanks!

Hi @carson.zoom, thanks for you response - I hadn’t realised that I needed to cast the IVideoRenderElementDotNetWrap to an IActiveVideoRenderElementDotNetWrap. Unfortunately I’m still having trouble - it seems that container.CreateVideoElement(VideoRenderElementType.VideoRenderElement_ACTIVE) is returning null for me. I’ve set InitParam.config_opts = new ConfigurableOptions() { optionalFeatures = 1 << 5 }. Is there something else that I’m missing? Do I need to call the CreateVideoElement() method at a particular point in time or under certain circumstances? Here’s my code for your reference:

var window = Application.Current.MainWindow;
                    IntPtr handle = GetHandle(window);
                    RECT bounds = GetBounds(window);
                    var ui = CZoomSDKeDotNetWrap.Instance.GetCustomizedUIMgrWrap();
                    var container = ui.CreateVideoContainer(handle, bounds);
                    var video = container.CreateVideoElement(VideoRenderElementType.VideoRenderElement_ACTIVE); // video is always null
                    var activeVideo = video as IActiveVideoRenderElementDotNetWrap;
                    
                    Console.WriteLine("Showing container");
                    var error = container.Show();
                    if (error != SDKError.SDKERR_SUCCESS)
                    {
                        Console.WriteLine("Error at container.Show: " + error);
                        break;
                    }
                    Console.WriteLine("Starting activeVideo");
                    error = activeVideo.Start(); // null reference exception is thrown here
                    if (error != SDKError.SDKERR_SUCCESS)
                    {
                        Console.WriteLine("Error at video.Start: " + error);
                    }

Hi t.barry-woods,

Thanks for the reply. I could not tell why you are getting unexpected results based on the code provided. Our C# wrapper’s source code is open source so the following resource could be helpful for troubleshooting this:

And the process to create a video window in Custom UI is like Wilmer has mentioned above:

Hope this helps. Thanks!

Thanks @carson.zoom - yes I think I’ve followed the steps outlined in @Wilmer_Sun’s description. Unfortunately I don’t know C++, but as far as I can tell, the problem is probably coming from this line (#64) in customized_video_container_dotnet_wrap.h:
SDKError result = (SDKError)m_pSDKObj->CreateVideoElement(&pObj, (ZOOM_SDK_NAMESPACE::VideoRenderElementType)elementType);
The returned result must be something other than SKERR_SUCCESS, but I have no way of telling what the error is or why. Any ideas?

I’ve tried copying this code into the Zoom SDK Demo project in case there was something specific to my application. I got the same results - an empty black rectangle on my host window and a null reference exception at video.Start();

Hey @carson.zoom, any ideas?

Thanks,
Tommy

Hello. I have the same issue and I wonder if there is any progress in there?

Hi @t.barry-woods
have you tried creating the video element after the meeting is started? You can’t create an active video until the state of the meeting is INMEETING. It is annoying, but that’s it. The C++ returns an error, but the C# wrapper return null instead. And you’ll never know why :slight_smile:

Thanks for the tip @bragma - I’ll give this a try. The C# wrapper is not the most user friendly when it comes to communicating errors!