title: How do I backup and restore the system clipboard in C#?
body: <p>I will do my best to explain in detail what I'm trying to achieve. </p>
  
  <p>I'm using C# with IntPtr window handles to perform a CTRL-C copy operation on an external application from my own C# application. I had to do this because there was no way of accessing the text directly using GET_TEXT. I'm then using the text content of that copy within my application. The problem here is that I have now overwritten the clipboard.</p>
  
  <p>What I would like to be able to do is:</p>
  
  <ol>
  <li>Backup the original contents of the clipboard which could have been set by any application other than my own.</li>
  <li>Then perform the copy and store the value into my application.</li>
  <li>Then restore the original contents of the clipboard so that the user still has access to his/her original clipboard data.</li>
  </ol>
  
  <p>This is the code I have tried so far:</p>
  
  <pre><code>private void GetClipboardText()
  {
  
      text = "";
  
      IDataObject backupClipboad = Clipboard.GetDataObject();
  
      KeyboardInput input = new KeyboardInput(this);
      input.Copy(dialogHandle); // Performs a CTRL-C (copy) operation
  
      IDataObject clipboard = Clipboard.GetDataObject(); 
      if (clipboard.GetDataPresent(DataFormats.Text))
      {
          // Retrieves the text from the clipboard
          text = clipboard.GetData(DataFormats.Text) as string;
      }
  
      if (backupClipboad != null) 
      {
          Clipboard.SetDataObject(backupClipboad, true); // throws exception
      }
  }
  </code></pre>
  
  <p>I am using the System.Windows.Clipboard and not the System.Windows.Forms.Clipboard. The reason for this was that when I performed the CTRL-C, the Clipboard class from System.Windows.Forms did not return any data, but the system clipboard did.</p>
  
  <p>I looked into some of the low level user32 calls like OpenClipboard, EmptyClipboard, and  CloseClipboard hoping that they would help my do this but so far I keep getting COM exceptions when trying to restore. </p>
  
  <p>I thought perhaps this had to do with the OpenClipboard parameter which is expecting an IntPtr window handle of the application which wants to take control of the clipboard. Since I mentioned that my application does not have a GUI this is a challenge. I wasn't sure what to pass here. Maybe someone can shed some light on that?</p>
  
  <p>Am I using the Clipboard class incorrectly? Is there a clear way to obtain the IntPtr window handle of an application with no GUI? Does anyone know of a better way to backup and restore the system clipboard?</p>