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 に答える