2012-05-12 1 views
4

私のC#プログラムは非常に奇妙な動作をしています。私はこのプログラムで4つの 'ハッキーな'ピンボークメソッド、GlobalKeyHooking、HotKey登録、SetForegroundWindow/GetForegroundWindow、SendKeys.Send/SendWaitを使用しています。P/Invoke関数の奇妙な動作 - マジックループ

私が理解していない動作があります。私は標準のカット/コピー&貼り付けルーチンが表示されて消えるリストボックス内のオートコンプリートリストに置き換えられるプログラムでCtrl + Vを盗んでいます。 Windows 7のあるコンピュータでは、私のプログラムはWindows 7(悲しいことにそれをデバッグするVS2010がない)の50%のコンピュータの魅力のように動作し、非常に奇妙なループが--- ---メソッド内に現れます。 CtrlとV自体がフックされているので、私は既にメソッドが無限にトリガーされるのを防いでいます。それで大丈夫です。しかし、メソッド内に別のループが表示されます。

簡単に:myDebugValueは23-24-25に達するまで増加します!何かが停止することを決定する前に何度も関数を実行しようとしています。

誰も既に同様の望ましくないループを見ていますか? try/catchブロックはありませんが、関数内でバウンスしています。

一部のWindows 7ではP/Invoke関数がクラッシュすることがありますか?

P/Invokesは、C#プログラムの実行よりも強力な独自の目に見えない低レベルのアセンブラエラーハンドラtry/catchを持っていますか?

視覚的に見ると、私のプログラムのUIがすばやく多くの時間、25回点滅しているのがわかります。

private bool getOutOfHere = false; 

    private int myDebugValue = 0; 

    private void globalKeyHooking_KeyUp(object sender, KeyEventArgs e) 
    { 
     if (getOutOfHere) return; 
     myDebugValue = 0; 
     if (e.KeyCode == Keys.LControlKey) 
     { 
      getOutOfHere = true; 
      SendKeys.SendWait("^v"); 
      getOutOfHere = false; 
      myDebugValue++; 
     }     
    } 

私は2.0、3.0および4.0で、かつ同じ4台のコンピュータ、すべてのケースで、それはまだ同じ割合でコンパイルしようとした:50%がクラッシュし、50%の作品。

[編集]

私は本当にSendKeys.Sendは、Windows 7

答えて

0

と異なるコンピュータで異なる作用することを考えては自分の質問に答えたくありませんでしたが、最初の時間は常にあります。 私は目標を達成し、SendKeysの使用を避けるために、InputSimulatorと同様の方法を使用することに決めました。今、すべてのマシンですべてが完璧に動作します。

InputSimulatorはWindows 7を使用するすべてのマシンと互換性があり、SendMessageまたはSendKeysの代わりにSendInputを使用していることがわかりましたので、私のアプリケーションでSendInputを使用しました。