在应用检测到粘贴失败后,可以调用 IsCrossIsolatedEnvironmentClipboardContent,以确定粘贴的内容是否来自Microsoft Defender 应用程序防护(MDAG)边界的另一侧。 在此方案中,应用程序可以显示自定义错误消息,以帮助用户了解 MDAG 有意阻止剪贴板作。
Syntax
HRESULT IsCrossIsolatedEnvironmentClipboardContent(
BOOL *isCrossIsolatedEnvironmentClipboardContent
);
参数
isCrossIsolatedEnvironmentClipboardContent
[out]
指向接收 API 结果的布尔值的指针。 如果剪贴板内容来自 MDAG 边界的另一端,则此参数为true此参数。 false
返回值
如果函数成功,则返回值为 S_OK. 如果失败,它将返回 HRESULT 错误代码。
注解
可以从主机和独立 Windows 环境应用实例调用此 API,并且可以检测这两个相关方案:
- 方案 1 - 从主机文档调用(例如:将内容粘贴到主机)
- 如果剪贴板内容来自任何独立 Windows 环境,则返回 true。
- 方案 2 - 从隔离的 Windows 环境文档调用(例如:将内容粘贴到独立环境)
- 如果剪贴板内容来自主机或来自其他独立 Windows 环境,则返回 true。
此 API 还允许应用在适当的情况下继续显示其默认粘贴错误处理程序。 例如,在同一独立环境中复制/粘贴内容不受 MDAG 剪贴板策略的约束。 任何失败都由不相关的粘贴错误(如损坏的数据)导致。 在这种情况下, IsCrossIsolatedEnvironmentClipboardContent 将返回 false,因此应用知道遵循其默认粘贴错误处理程序流。
例子
此示例演示如何应用自定义向用户显示的粘贴错误消息。 第一个代码片段演示如何使用 IsCrossIsolatedEnvironmentClipboardContent 在应用粘贴处理程序失败时显示相应的错误消息。 在此示例中,应用的粘贴处理程序 OnPaste (在第二个代码片段中定义)由 WM_PASTE 接收 WndProc的消息调用。
// Assume this is the WndProc method that handles WM messages for an app.
// Assume SampleAppHelperClass::DisplayMsgBox shows a simple UI error dialog with given string.
LRESULT CALLBACK SampleAppWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
LRESULT retVal = 0;
switch (message)
{
case WM_PASTE:
{
RETURN_LAST_ERROR_IF(!OpenClipboard(hWnd));
// See definition of OnPaste in code snippet #2, below.
retVal = OnPaste(hWnd, message, wParam, lParam);
// To avoid a race condition with the clipboard changing underneath us, call
// IsCrossIsolatedEnvironmentClipboardContent with the clipboard still open.
HRESULT hr = S_OK;
BOOL isCrossEnvContent = FALSE;
hr = IsCrossIsolatedEnvironmentClipboardContent(&isCrossEnvContent);
CloseClipboard();
if (retVal != ERROR_SUCCESS)
{
// Show a MDAG specific error message if the clipboard content crossed the host/isolated
// environment boundary. Otherwise, show the app’s default paste error message.
if (SUCCEEDED(hr) && isCrossEnvContent)
{
// This runs on both the host and Isolated Environment app instance, so customize error
// message per scenario.
BOOL isIsolatedWindowsEnvironment = FALSE;
IsProcessInIsolatedWindowsEnvironment(&isIsolatedWindowsEnvironment);
std::wstring direction = isIsolatedWindowsEnvironment ? L"into" : L"from";
SampleAppHelperClass::DisplayMsgBox(hWnd, L"Pasting content %s a MDAG document failed, verify this operation is permitted by your administrator.\n", direction.c_str());
}
else
{
SampleAppHelperClass::DisplayMsgBox(hWnd, L"Paste operation failed.\nError code 0x%x", retVal);
}
}
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return retVal;
}
第二个代码片段显示应用的粘贴处理程序,以演示如何在 MDAG 阻止的情况下剪贴板作失败。
// Invoked by user Paste action, such as Ctr+V or clicking the Paste button.
HRESULT OnPaste(HWND hWnd)
{
RETURN_LAST_ERROR_IF(!IsClipboardFormatAvailable(CF_TEXT));
HGLOBAL clipboardData = GetClipboardData(CF_TEXT);
RETURN_LAST_ERROR_IF(clipboardData == NULL);
// Now that we've verified clipboard access suceeds, assume InsertTextFromClipboard is an
// application defined method to insert text into desired location.
RETURN_IF_FAILED(InsertTextFromClipboard(clipboardData, hWnd));
CloseClipboard();
return S_OK;
}
要求
| Requirement | 价值 |
|---|---|
| Header | isolatedwindowsenvironmentutils.h |
| Library | IsolatedWindowsEnvironmentUtils.lib |
| DLL | isolatedwindowsenvironmentutils.dll |