使用SendKeys()时 - InvalidOperationException:遇到撤消操作

时间:2010-06-02 14:17:17

标签: c# sendkeys invalidoperationexception

这是我的代码

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");

    }

执行此代码后,我收到错误,我知道源代码是SendKeys。

以下是我正在接收的完整错误

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: 

我不确定问题是什么,这个数字会出现在我的计算器中,但会弹出错误

2 个答案:

答案 0 :(得分:2)

好的,基于您对我的问题的回答,我将做出两个假设。

  1. 您正在从异步执行的函数调用KeyPress,可能来自BeginReceive或类似的回调函数。

  2. 您的应用程序是一个Windows窗体应用程序。

  3. 如果上述假设是正确的,那么我怀疑问题在于SendKeys在内部使用Windows消息传递并且问题正在发生,因为SendkKeys消息是从UI线程以外的线程发送的。如果这是正确的,您可以使用Control.Invoke来调用KeyPress函数来解决问题。使用Control.Invoke会将回调编组回UI线程。

答案 1 :(得分:1)

我自己玩这个游戏并且无法复制它。

谷歌搜索并找到了以下文章,其中有很多建议,您可以尝试一下。 http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/48b4a763-7387-46da-8fc2-3e885670f62c

当然,你可能已经看过了,这就是你来到这里的原因。

您可能需要提供有关调用代码的上下文的更多信息。该应用程序的目的是什么,这是如何适应的?你能告诉它失败的代码行吗?

另外,正如@SLaks所建议的那样,您是否可以在内部异常中包含更多详细信息?