При использовании SendKeys () - InvalidOperationException: обнаружена операция отмены - PullRequest
1 голос
/ 02 июня 2010

Вот мой код

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 ]

2 голосов
/ 02 июня 2010

ОК, поэтому на основании вашего ответа на мой вопрос я сделаю 2 предположения.

  1. Вы вызываете KeyPress из функции, которая выполняется асинхронно, возможно, из-за обратного вызова BeginReceive или чего-то подобного.

  2. Ваше приложение является приложением Windows Forms.

Если приведенные выше предположения верны, то я подозреваю, что проблема заключается в том, что SendKeys используют внутренние сообщения Windows, и проблема возникает потому, что сообщения SendkKeys отправляются из потока, отличного от потока пользовательского интерфейса. Если это правильно, вы можете решить проблему, используя Control.Invoke для вызова функции KeyPress. Использование Control.Invoke перенаправит вызов обратно в поток пользовательского интерфейса.

1 голос
/ 02 июня 2010

Я сам поиграл с этим и не смог его воспроизвести.

Сделал поиск в Google и нашел следующую статью, в которой есть довольно много предложений, которые вы можете попробовать. http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/48b4a763-7387-46da-8fc2-3e885670f62c

Конечно, вы, возможно, уже смотрели туда, вот почему вы пришли сюда.

Возможно, вам потребуется предоставить более широкую информацию о контексте, в котором вы вызываете код. Какова цель приложения, как это вписывается? Можете ли вы сказать, на какой строке кода происходит сбой?

Кроме того, как предложил @SLaks, можете ли вы включить больше подробностей о внутреннем исключении?

...