diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index 4c5d6eaef18..93009bcca4a 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -784,7 +784,12 @@ TerminalInput::OutputType Terminal::SendCharEvent(const wchar_t ch, const WORD s // - none TerminalInput::OutputType Terminal::FocusChanged(const bool focused) { - return _getTerminalInput().HandleFocus(focused); + if (_isFocused != focused) + { + _isFocused = focused; + return _getTerminalInput().HandleFocus(focused); + } + return {}; } // Method Description: diff --git a/src/cascadia/TerminalCore/Terminal.hpp b/src/cascadia/TerminalCore/Terminal.hpp index 73974e85dad..1b072a6d142 100644 --- a/src/cascadia/TerminalCore/Terminal.hpp +++ b/src/cascadia/TerminalCore/Terminal.hpp @@ -414,6 +414,7 @@ class Microsoft::Terminal::Core::Terminal final : til::CoordType _scrollbackLines = 0; bool _detectURLs = false; bool _clipboardOperationsAllowed = true; + bool _isFocused = false; til::size _altBufferSize; std::optional _deferredResize; diff --git a/src/cascadia/TerminalCore/TerminalApi.cpp b/src/cascadia/TerminalCore/TerminalApi.cpp index 825712028ee..7d1fb34bf93 100644 --- a/src/cascadia/TerminalCore/TerminalApi.cpp +++ b/src/cascadia/TerminalCore/TerminalApi.cpp @@ -140,7 +140,8 @@ unsigned int Terminal::GetInputCodePage() const noexcept void Terminal::CopyToClipboard(wil::zwstring_view content) { - if (_clipboardOperationsAllowed) + // Only allow VT clipboard writes when the terminal has focus + if (_clipboardOperationsAllowed && _isFocused) { _pfnCopyToClipboard(content); } diff --git a/src/host/outputStream.cpp b/src/host/outputStream.cpp index 5ef852065f4..a531266ec2a 100644 --- a/src/host/outputStream.cpp +++ b/src/host/outputStream.cpp @@ -282,7 +282,13 @@ unsigned int ConhostInternalGetSet::GetInputCodePage() const // - void ConhostInternalGetSet::CopyToClipboard(const wil::zwstring_view content) { - ServiceLocator::LocateGlobals().getConsoleInformation().CopyTextToClipboard(content); + auto& gci = ServiceLocator::LocateGlobals().getConsoleInformation(); + + // Only allow VT clipboard writes when the console has focus + if (WI_IsFlagSet(gci.Flags, CONSOLE_HAS_FOCUS)) + { + gci.CopyTextToClipboard(content); + } } // Routine Description: