IsCrossIsolatedEnvironmentClipboardContent 函数 (isolatedwindowsenvironmentutils.h)

在应用检测到粘贴失败后,可以调用 IsCrossIsolatedEnvironmentClipboardContent,以确定粘贴的内容是否来自Microsoft Defender 应用程序防护 (MDAG) 边界的另一侧。 在此方案中,应用程序可以显示自定义错误消息,以帮助用户了解 MDAG 有意阻止了剪贴板操作。

语法

HRESULT IsCrossIsolatedEnvironmentClipboardContent(
  BOOL *isCrossIsolatedEnvironmentClipboardContent
);

参数

isCrossIsolatedEnvironmentClipboardContent

[out]

指向接收 API 结果的布尔值的指针。 如果剪贴板内容来自 MDAG 边界的另一侧,则此参数为 truefalse 否则为 。

返回值

如果函数成功,则返回值为 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;
}

要求

要求
Header isolatedwindowsenvironmentutils.h
DLL isolatedwindowsenvironmentutils.dll

另请参阅

Microsoft Defender 应用程序防护概述

IsolatedWindowsEnvironment

IsolatedWindowsEnvironmentHost