2010-06-02 2 views
1

Вот мой кодПри использовании SendKeys() - InvalidOperationException: Undo Операция встречается

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

Эта ошибка не имеет ничего общего с 'SendKeys'. Что такое 'InnerException'? Вы выполняете асинхронный ввод-вывод? – SLaks

+0

Используют сокеты для чего-либо в приложении? Похоже, что проблема связана с завершением работы асинхронного сокета. –

+0

@ SLaks- Я считаю, что мы используем асинхронный ввод-вывод. Внутреннее исключение - NULL. @ Chris- Да, мы используем сокеты, передавая переменную, чтобы вызвать функцию. Приложение при нажатии кнопки на командном пункте вызовет функцию на клиенте. И используйте sendkeys для имитации нажатия кнопки в приложении на клиенте. Нужна дополнительная информация? – M0DC0M

ответ

1

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

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

  2. Ваше приложение представляет собой приложение для форм Windows.

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

+0

Мне пришлось использовать метод Control.Invoke (Delegate, Object []) У меня есть еще один программист, работающий над проектом, и Control.Вызов в сочетании с частным делегатом получил программу, работающую Спасибо – M0DC0M

1

я имел игру с это я и не мог воспроизвести.

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

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

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

Также, как предположил @SLaks, вы можете включить более подробную информацию о внутреннем исключении?

+0

+1 для ссылки на тему. Хотя на social.msdn.microsoft.com были другие связанные потоки, ни одна из них не сравнима с предоставленной ссылкой. Благодарю. –

Смежные вопросы