Search code examples
c#sendkeysinvalidoperationexception

When using SendKeys()-InvalidOperationException: Undo Operation encountered


Here is my code

public void KeyPress()
    {
        //Finds the target window and sends a key command to the application
        Process[] processes = Process.GetProcessesByName("calc");
        IntPtr calculatorHandle;
        foreach (Process proc in processes)
        {
            calculatorHandle = proc.MainWindowHandle;

            if (calculatorHandle == IntPtr.Zero)
            {
                MessageBox.Show("Calculator is not running.");
                return;
            }
            SetForegroundWindow(calculatorHandle);

            break;
        }

        SendKeys.SendWait("1");

    }

After Executing this code I recieve an Error, i know the source is the SendKeys.

Here is the full error I am Receiving

System.InvalidOperationException was unhandled
  Message="The Undo operation encountered a context that is different from what was applied in the corresponding Set operation. The possible cause is that a context was Set on the thread and not reverted(undone)."
  Source="mscorlib"
  StackTrace:
       at System.Threading.SynchronizationContextSwitcher.Undo()
       at System.Threading.ExecutionContextSwitcher.Undo()
       at System.Threading.ExecutionContext.runFinallyCode(Object userData, Boolean exceptionThrown)
       at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteBackoutCodeHelper(Object backoutCode, Object userData, Boolean exceptionThrown)
       at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Net.ContextAwareResult.Complete(IntPtr userToken)
       at System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken)
       at System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
       at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
  InnerException: 

I'm not sure what the problem is, The number will appear in my calculator but that error pops up


Solution

  • OK, so based on your response to my question I will make 2 assumptions.

    1. You are calling KeyPress from a function that is being executed asynchronously, possibly from the callback of a BeginReceive or something similar.

    2. Your application is a windows forms application.

    If the above assumptions are correct then I suspect that the problem is with the fact that SendKeys using windows messaging internally and the problem is occurring because the SendkKeys messages are being sent from a thread other than the UI thread. If this is correct, you might be able to resolve the problem by using Control.Invoke to make the call to the KeyPress function. Using Control.Invoke will marshal the call back to the UI thread.