Windows上用C语言定时器

时间:2015-01-21 20:26:19

标签: c

我正在制作测验计划。显示一个问题并启动计时器。用户必须在30秒内回答问题。如果他在30秒内没有回答问题,则计时器结束并显示下一个问题。问题是我遇到的所有TIMER程序都停止了该程序,即用户无法在该计时器中输入他的答案

1 个答案:

答案 0 :(得分:2)

正确的方法是使用线程或0.1秒睡眠。

您应该从一些教程中获得一些Windows应用程序(您通过WinMain()而不是main()识别典型的Windows应用程序示例。)

然后您可以添加以下功能:

SetTimerKillTimer

这是一个完整的工作示例:它创建一个带有文本输入的窗口,使其聚焦并将计时器设置为1秒。当计时器到期时,它从文本输入中获取文本并在对话框中显示它。

#include <windows.h>

HWND hwndMain = 0;
HWND hwndEdit = 0;
#define idTimer 123
VOID CALLBACK TimerProc(HWND w, UINT msg, UINT_PTR e, DWORD t) {
  Beep(2000, 10);
  KillTimer(hwndMain, idTimer);
  char tmp[100];
  GetWindowText(hwndEdit, tmp, 100);
  MessageBox(0, tmp, "you entered:", 0);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM w, LPARAM l)
{
  #define id_note 50

    switch(msg) {
      case WM_CREATE:
        hwndMain = hwnd;
        hwndEdit = CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",
        "",WS_CHILD|WS_VISIBLE,
        0,0,80,20,hwnd,(HMENU)id_note,GetModuleHandle(0), 0);
        SetFocus(hwndEdit);
        SetTimer(hwndMain, idTimer, 1000, TimerProc);
      break;
      case WM_CLOSE:
          DestroyWindow(hwnd);
      break;
      case WM_DESTROY:
          PostQuitMessage(0);
      break;
      default:
        return DefWindowProc(hwnd, msg, w, l);
    }
    return 0;
}

const char g_szClassName[] = "myWindowClass";
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;
    memset(&wc, 0, sizeof(WNDCLASSEX));
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.lpfnWndProc   = WndProc;
    wc.hInstance     = hInstance;
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszClassName = g_szClassName;
    wc.hIconSm       = LoadIcon(0, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        g_szClassName,
        "",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
        0, 0, hInstance, 0);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&Msg, 0, 0, 0) > 0) {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}