4

これはおそらく、これまで C++ で遭遇した中で最も奇妙なことの 1 つです。

while(counter != stop_value)
{
    //Part A starting
    ip.ki.wVk = VK_RETURN;
    ip.ki.dwFlags = 0;
    SendInput(1, &ip, sizeof(INPUT));
    ip.ki.wVk = VK_RETURN;
    ip.ki.dwFlags = KEYEVENTF_KEYUP;
    SendInput(1, &ip, sizeof(INPUT));
    //Part A ending

    if (s == 2) counter++;
    else counter--;
    cout << counter; //for debugging
    Sleep(i);
}

「パートA」の部分をコメントアウトすると、正常に機能します。iユーザーの入力に応じて、プログラムは数秒間スリープします。ただし、リターンキーをトリガーする簡単な方法を追加するとすぐに、代わりにコンピューター全体がスリープ状態になります (別名、画面がi数秒間完全に黒くなります)。グーグルで試してみましたが、これについて何も見つかりません。

そして、これはコードのほんの一部です。INPUT クラスとすべてを追加しました。sはユーザー定義変数でもあり、(この場合) 2 から 3 の間で変化する可能性があります。2 に等しい場合、カウンターの値は 0 に設定され、最大値 (ユーザー変数) に達するまで増加します。 -定義され、 に設定されstop-valueます)。この方法を使用している間、sleep機能は正常に動作し、プログラムだけがi数秒間「一時停止」します。ただし、ユーザーが 3 に設定するとすぐにs、最大値 (ユーザー定義) から、常にゼロに等しい停止値に達するまで減少し始めます。これが発生すると、代わりに画面がブラックアウトします。

私は何年もの間デバッグを試みましたが、解決策を見つけることができないようです...コードはこれよりもはるかに複雑であり、より多くのスペースを使用する必要があるため(これは望ましくありません) to)、代わりに使用できる変数の入力をいくつか示します。

  • 作業入力: counter = 0; stop_value = 21; s = 2; i = 1000;
  • 画面のブラックアウトにつながる入力: counter = 20; stop_value = 0; s = 3; i = 1000;

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ ms686298(v=vs.85).aspx

4

1 に答える 1

1

答えとしてそれを固執することもできます:)

のタイプを に設定していipますINPUT_KEYBOARDか? ZeroMemory使用前に構造上で使用していますか?

于 2013-10-31T17:02:47.807 に答える