2013-10-31 54 views
4

这大概是我在C++迄今为止遇到的最奇怪的事情之一:睡眠(X)导致计算机,而不是睡觉

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秒内完全变黑)。我试过Google搜索,但我找不到任何关于此的内容。

而且,这只是代码的一小部分。我已经添加了INPUT类和所有的一切。 s也是一个用户定义的变量,在这种情况下(在这种情况下)可以在2和3之间变化。如果等于2,计数器的值将被设置为0,并且它将增加,直到它达到其最大值(即用户自定义,并设置为stop-value)。在使用这个方法时,sleep函数可以正常工作,并且只有程序“暂停”i秒。但是,只要用户将s设置为3,它就会从最大值(用户定义)开始减少,直到达到其始终等于零的停止值。发生这种情况时,屏幕会变黑。

我试过调试了很多年了,我似乎无法找到解决方案...由于代码的方式比这更复杂,我需要使用更多的空间方式(我不想),我给你一些投入的变量,你可以改用:

  • 工作输入: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

+0

如果(假设您使用的是Visual Studio)突出显示“睡眠”并按F12,它应该将您带到它定义的标题处。这应该是Windows SDK中的'WinBase.h'。如果它的功能不同,那就是你的问题。 – benjymous

+1

注意:你最好设置远程调试 - 通常发送键盘事件和焦点相关的问题很难在同一台机器上调试... –

+2

漂亮的不可知的,什么样的窗口或小部件准确得到这个击键?远离“格式化驱动器”菜单项。 –

回答

1

可能也坚持将其作为答案:)

你的ip类型设置为INPUT_KEYBOARD?并在使用前在结构上使用ZeroMemory

+1

正如上面的评论中所说的那样,我意外地忘记了确保在s = 3时将类型设置为'INPUT_KEYBOARD'。再次感谢! – Max