1

这是我的代码

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: 

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

4

2 回答 2

2

好的,所以根据您对我的问题的回答,我将做出 2 个假设。

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

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

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

于 2010-06-02T18:55:45.810 回答
1

我自己也玩过这个游戏,但无法复制它。

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

当然,您可能已经看过那里,这就是您来这里的原因。

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

另外,正如@SLaks 所建议的那样,您能否包含有关内部异常的更多详细信息?

于 2010-06-02T14:53:38.433 回答