这是我的代码
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:
我不确定问题是什么,这个数字会出现在我的计算器中,但会弹出错误
答案 0 :(得分:2)
好的,基于您对我的问题的回答,我将做出两个假设。
您正在从异步执行的函数调用KeyPress,可能来自BeginReceive或类似的回调函数。
您的应用程序是一个Windows窗体应用程序。
如果上述假设是正确的,那么我怀疑问题在于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所建议的那样,您是否可以在内部异常中包含更多详细信息?