私の C# プログラムは非常に奇妙な動作をします。このプログラムでは、GlobalKeyHooking、HotKey Registering、SetForegroundWindow/GetForegroundWindow、SendKeys.Send/SendWait の 4 つの「ハッキー」な pinvoke メソッドを使用しています。
ここで、私が理解できない動作があります。標準の切り取り/コピー&貼り付けルーチンが、表示および非表示になるリストボックスのオートコンプリート リストに置き換えられているプログラムで Ctrl+V を盗んでいます。Windows 7を搭載した一部のコンピューターでは、私のプログラムは魔法のように機能し、Windows 7を搭載した他の50%のコンピューター(悲しいことにデバッグするVS2010はありません)では、非常に奇妙なループがメソッド内に表示されます。Ctrl と V 自体がフックされているため、メソッドが無限にトリガーされるのを防止しました。それで大丈夫です。しかし、別のループがメソッド内に表示されます。
簡単に言うと、myDebugValue は 23-24-25 に達するまで増加します! そのため、停止を決定する前に、何かが関数を何度も実行しようとしています。
同様の望ましくないループをすでに見た人はいますか? try/catch ブロックはありませんが、関数内でバウンスしています。
一部の P/Invokes 関数が一部の Windows 7 でクラッシュし、他の Windows 7 ではクラッシュしないことがありますか?
P/Invoke には、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 を搭載したコンピューターによって動作が異なると本当に思います。