如何在没有WIN32 API的情况下执行此操作?

问题描述:

所以,这是倒计时。 我的目标是下一个:如果你在给定的时间内没有做任何事(ent_sec),倒数将在一段时间后达到0,并返回0,但如果你按下字母c(代码:99)倒数停止您可以输入您的PIN码并返回。 我已经与WINDOWS.H解决了这个问题,在未来的方式:如何在没有WIN32 API的情况下执行此操作?

if (GetAsyncKeyState(VK_SPACE)) 

这解决了问题,就是通过WIN32 API(在这种情况下,你必须按空格,没有字母“C”),但它透露我不能使用任何WinAPI功能(学校项目)。所以我重写这一行下面:

if (getchar() == 99) 

不过遗憾的是它并没有以适当的方式工作,因为我的倒计时停止在几乎每一秒钟,直到我dont't按一些“错误”键(例如我按'x',然后倒计时继续进行,但在接下来的秒钟中再次停止)...在第一个解决方案(win func)中,这个问题不存在......那么我该如何解决这个问题?谢谢。这里是我的函数的整个代码:

unsigned Timer::DownCount 
{ 
    int ent_sec = this.time; 

    cout << "The counter has started (" << this.time << "sec), press 'C' to enter your PIN code: " << endl; 


    while (ent_sec >= 0)          
    { 
    if (getchar() == 99) // c letter's code is 99 in ANSI (or ASCII dunno)      
    {            
     unsigned code; 

     cout << "PIN code: "; 
     cin >> code;  

     return code; 
    } 

    else 
    { 
     SecCounter(1);  // this function counts 1 secundum 
     cout << ent_sec << endl; 
     ent_sec--; 
    } 
    } 
return 0; 
} 

我不相信有这样做,将在所有平台上工作的标准方式,但这里是这样做的一个方式,将在Windows上运行,而无需实际使用Windows API函数。

int getch_nowait() 
{ 
    if (!kbhit()) return -1; 
    return getch(); 
} 

那么你的支票只是变得if (getch_nowait() == 99) ...

此代码可能是编译器特定的。如果它不适合你,如果你告诉我们你正在使用什么编译器和操作系统,它会有所帮助。

+0

嗨。真的非常感谢你的帖子。即时通讯使用Windows7和Visual Studio 2012.我照顾后,kbhit()函数,但问题是,它是在conio.h,我也不能真的包括... :(但我是开明的每个解决方案,所以如果你(或其他人)有任何其他想法,请不要犹豫,并写下它。Thx – user2369698 2013-05-10 22:48:57

+0

我想知道如果你可以使用ncurses.h,如果它可以工作,我相信那就是你可以用它在Unix系统上实现这样的功能,但显然也有一个可用于Windows的端口可以工作,它不比使用conio.h更标准,但如果你的学校反对使用Windows特定的库,他们可能会允许它 – 2013-05-10 23:14:15

+0

谢谢,我会看看 – user2369698 2013-05-10 23:46:24