Zoom Plugin SDK for Windows
Use native C++ to control Zoom Workplace from a separate Windows desktop application.
Start Here
- Read Lifecycle and Integration.
- Use Package and API Map to locate the authoritative interface and sample dialog for a feature.
- Use Capabilities to check whether the official client can do the requested operation.
- Build the bundled
PSDKTest sample in the matching architecture.
- Implement auth, IPC, and meeting-state callbacks before feature controls.
- Use Common Issues for build, runtime DLL, listener, permission, and compatibility failures.
Baseline Requirements
- A Zoom Marketplace General app with Plugin SDK enabled.
- A user OAuth access token containing
plugin_sdk:read:connection_meta.
- Zoom Workplace
7.0.2 or later according to the public setup documentation.
- Visual Studio 2019 or later.
- A consistent x86 or x64 selection across headers, library, runtime DLLs, application, and Zoom Workplace compatibility.
Package review baseline: zoom-plugin-sdk-windows-7.1.0.2020.
Minimal Lifecycle
IZMToolSuiteProxyListener is a pure virtual interface in this package. Implement every required callback, even if most handlers are initially no-ops.
#include "ToolSuiteProxyInterface.h"
using namespace ZMToolSuiteProxy;
class PluginController : public IZMToolSuiteProxyListener {
public:
void Initialize(const std::wstring& accessToken) {
InitZMToolSuite();
ZMToolSuiteProxyAuthContext context;
context.domain = L"https://zoom.us";
context.accessToken = accessToken.c_str();
StartToolSuiteAuth(context);
SetToolSuiteProxyListener(this);
}
void Shutdown() {
UninitZMToolSuite();
SetToolSuiteProxyListener(nullptr);
}
void OnAuthResult(ZMToolSuiteProxyAuthResult result) override {}
void OnIPCConnectStatusChanged(
ZMToolSuiteIPCConnectStatus status,
std::string errorMessage
) override {}
void OnMeetingStatusChanged(ZMToolSuiteMeetingStatus status) override {}
// Implement the remaining pure virtual callbacks from
// ToolSuiteProxyInterface.h for the selected package version.
};
Keep the controller alive until after UninitZMToolSuite() and listener removal.
Start or Join
JoinMeetingParam join;
join.displayName = L"Display Name";
join.meetingNumber = 1234567890LL;
join.password = L"";
bool submitted = premeeting::GetPreMeetingToolkit()->JoinMeeting(
join,
[](const BaseResult& result) {
if (result.error_code != kZMToolSuiteProxyErrorsSuccess) {
return;
}
}
);
The Boolean reports whether the request was submitted. Use BaseResult.error_code and OnMeetingStatusChanged for the asynchronous outcome.
Implementation Guardrails
- Wait for
AUTH_RESULT_SUCCESS and IPC_STATUS_CONNECTED before pre-meeting controls.
- Wait for
MEETING_STATUS_INMEETING before meeting toolkits.
- Use the correct
ZMToolSuiteMeetingInstance for default, green-room, or breakout-room contexts.
- Check role, policy, and
Can*/IsSupport* methods before privileged actions.
- Keep callback-owned pointers and vector data within their documented lifetime; copy data needed later.
- Marshal callback-driven UI changes to the application's UI thread.
- Ship the complete matching
bin/ runtime dependency set beside the executable.
- Do not embed an OAuth client secret in a distributed desktop binary.
Feature Routing
| Task |
API family |
| Initialize/authenticate/uninitialize/listener |
ToolSuiteProxyInterface.h |
| Start/join, settings window, URL navigation |
premeeting::GetPreMeetingToolkit() |
| Status, properties, leave/end, statistics |
meeting::GetMeetingToolkit(instance) |
| Roster, roles, permissions, host controls |
meeting::GetParticipantsToolkit(instance) |
| Audio/video controls |
meeting::GetAudioToolkit(instance) and GetVideoToolkit(instance) |
| App/window, monitor, camera, file, audio, frame, whiteboard share |
meeting::GetShareToolkit(instance) |
| Recording, waiting room, chat, captions, Q&A, webinar |
Matching meeting::Get*Toolkit(instance) |
| Device and processing settings |
setting::GetSettingToolkit() |
Sources
1---2name: zoom-plugin-sdk-windows3description: Zoom Plugin SDK for native Windows companion applications using C++, Win32, or MFC to control an installed Zoom Workplace client over IPC. Use for Visual Studio integration, OAuth initialization, listener implementation, start/join flows, participant controls, audio/video settings, window or monitor sharing, recording, captions, and supported meeting UI operations on Windows.4---56# Zoom Plugin SDK for Windows78Use native C++ to control Zoom Workplace from a separate Windows desktop application.910## Start Here11121. Read [Lifecycle and Integration](references/lifecycle-and-integration.md).132. Use [Package and API Map](references/package-and-api-map.md) to locate the authoritative interface and sample dialog for a feature.143. Use [Capabilities](capabilities.md) to check whether the official client can do the requested operation.154. Build the bundled `PSDKTest` sample in the matching architecture.165. Implement auth, IPC, and meeting-state callbacks before feature controls.176. Use [Common Issues](troubleshooting/common-issues.md) for build, runtime DLL, listener, permission, and compatibility failures.1819## Baseline Requirements2021- A Zoom Marketplace General app with Plugin SDK enabled.22- A user OAuth access token containing `plugin_sdk:read:connection_meta`.23- Zoom Workplace `7.0.2` or later according to the public setup documentation.24- Visual Studio 2019 or later.25- A consistent x86 or x64 selection across headers, library, runtime DLLs, application, and Zoom Workplace compatibility.2627Package review baseline: `zoom-plugin-sdk-windows-7.1.0.2020`.2829## Minimal Lifecycle3031`IZMToolSuiteProxyListener` is a pure virtual interface in this package. Implement every required callback, even if most handlers are initially no-ops.3233```cpp34#include "ToolSuiteProxyInterface.h"3536using namespace ZMToolSuiteProxy;3738class PluginController : public IZMToolSuiteProxyListener {39public:40 void Initialize(const std::wstring& accessToken) {41 InitZMToolSuite();4243 ZMToolSuiteProxyAuthContext context;44 context.domain = L"https://zoom.us";45 context.accessToken = accessToken.c_str();4647 StartToolSuiteAuth(context);48 SetToolSuiteProxyListener(this);49 }5051 void Shutdown() {52 UninitZMToolSuite();53 SetToolSuiteProxyListener(nullptr);54 }5556 void OnAuthResult(ZMToolSuiteProxyAuthResult result) override {}57 void OnIPCConnectStatusChanged(58 ZMToolSuiteIPCConnectStatus status,59 std::string errorMessage60 ) override {}61 void OnMeetingStatusChanged(ZMToolSuiteMeetingStatus status) override {}6263 // Implement the remaining pure virtual callbacks from64 // ToolSuiteProxyInterface.h for the selected package version.65};66```6768Keep the controller alive until after `UninitZMToolSuite()` and listener removal.6970## Start or Join7172```cpp73JoinMeetingParam join;74join.displayName = L"Display Name";75join.meetingNumber = 1234567890LL;76join.password = L"";7778bool submitted = premeeting::GetPreMeetingToolkit()->JoinMeeting(79 join,80 [](const BaseResult& result) {81 if (result.error_code != kZMToolSuiteProxyErrorsSuccess) {82 return;83 }84 }85);86```8788The Boolean reports whether the request was submitted. Use `BaseResult.error_code` and `OnMeetingStatusChanged` for the asynchronous outcome.8990## Implementation Guardrails9192- Wait for `AUTH_RESULT_SUCCESS` and `IPC_STATUS_CONNECTED` before pre-meeting controls.93- Wait for `MEETING_STATUS_INMEETING` before meeting toolkits.94- Use the correct `ZMToolSuiteMeetingInstance` for default, green-room, or breakout-room contexts.95- Check role, policy, and `Can*`/`IsSupport*` methods before privileged actions.96- Keep callback-owned pointers and vector data within their documented lifetime; copy data needed later.97- Marshal callback-driven UI changes to the application's UI thread.98- Ship the complete matching `bin/` runtime dependency set beside the executable.99- Do not embed an OAuth client secret in a distributed desktop binary.100101## Feature Routing102103| Task | API family |104|---|---|105| Initialize/authenticate/uninitialize/listener | `ToolSuiteProxyInterface.h` |106| Start/join, settings window, URL navigation | `premeeting::GetPreMeetingToolkit()` |107| Status, properties, leave/end, statistics | `meeting::GetMeetingToolkit(instance)` |108| Roster, roles, permissions, host controls | `meeting::GetParticipantsToolkit(instance)` |109| Audio/video controls | `meeting::GetAudioToolkit(instance)` and `GetVideoToolkit(instance)` |110| App/window, monitor, camera, file, audio, frame, whiteboard share | `meeting::GetShareToolkit(instance)` |111| Recording, waiting room, chat, captions, Q&A, webinar | Matching `meeting::Get*Toolkit(instance)` |112| Device and processing settings | `setting::GetSettingToolkit()` |113114## Sources115116- [Official Windows docs](https://developers.zoom.us/docs/plugin-sdk/windows/)117- [Parent Plugin SDK skill](../SKILL.md)118- [Native Zoom Workplace Companion use case](../../general/use-cases/native-zoom-workplace-companion.md)