4

私の 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 を搭載したコンピューターによって動作が異なると本当に思います。

4

1 に答える 1

0

自分の質問には答えたくありませんでしたが、初めての質問は常にあります。目標を達成し、SendKeys の使用を避けるために、InputSimulatorと同様の方法を使用することにしました。これで、すべてのマシンですべてが完全に機能します。

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

于 2012-05-13T03:25:45.507 に答える