WIN32编程断点无法命中WM_TIMER消息

在WIN32编程中,设置了定时器,我在WM_Timer消息中打上断点,却无法命中断点,是怎么回事?
大家看看我的代码有没有问题?

 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT    rect;   
    int TIMER1 = 1;
    SYSTEMTIME st;
    static TCHAR str[50];
    switch (message)
    {
    case WM_CREATE:SetTimer(hwnd, TIMER1, 100, NULL);
        return 0;       
    case WM_PAINT:
        hdc = GetDC(hwnd);      
        TextOut(hdc, 0, 0, str, 50);        
        ReleaseDC(hwnd, hdc);
        return 0;
    case WM_TIMER:
        GetLocalTime(&st);      
        GetTimeFormat(LOCALE_SYSTEM_DEFAULT, TIME_FORCE24HOURFORMAT, &st, "hh':'mm':'ss", str, 50);     
        return 0;
    case WM_DESTROY:
        KillTimer(hwnd, TIMER1);
        PostQuitMessage(0);
        return 0;


    }

    return DefWindowProc(hwnd, message, wParam, lParam);
}

4个回答

 /*--------------------------------------
   BEEPER1.C -- Timer Demo Program ver1
--------------------------------------*/

#include <windows.h>
#include <stdlib.h>

#define ID_TIMER    1

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[] = TEXT("Beeper1");
    HWND         hwnd;
    MSG          msg;
    WNDCLASS     wndclass;

    wndclass.style         = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc   = WndProc;
    wndclass.cbClsExtra    = 0;
    wndclass.cbWndExtra    = 0;
    wndclass.hInstance     = hInstance;
    wndclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);
    wndclass.lpszMenuName  = NULL;
    wndclass.lpszClassName = szAppName;

    if (!RegisterClass (&wndclass))
    {
    MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
    return 0 ;
    }

    hwnd = CreateWindow(szAppName, TEXT ("Beeper1 Timer Demo"),
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HBRUSH          hBrush;
    HDC             hdc;
    PAINTSTRUCT     ps;
    RECT            rc;

    switch (message)
    {
    case WM_CREATE:
        SetTimer(hwnd, ID_TIMER, 1000, NULL);
        return 0 ;

    case WM_TIMER:
        MessageBeep(-1);
        InvalidateRect(hwnd, NULL, FALSE);
        return 0;

    case WM_PAINT:
        hdc = BeginPaint (hwnd, &ps) ;

        GetClientRect(hwnd, &rc);
        hBrush = CreateSolidBrush(RGB(rand()%255, rand()%255, rand()%255));
        FillRect(hdc, &rc, hBrush);

        EndPaint (hwnd, &ps) ;
        return 0 ;

    case WM_DESTROY:
        KillTimer(hwnd, ID_TIMER);
        PostQuitMessage (0) ;
        return 0 ;
    }
    return DefWindowProc (hwnd, message, wParam, lParam) ;
}

你的OnTimer函数呢,setTimer,但三个参数,给空的话,应该要调用OnTimer函数,不会调用你自定义函数

pipi6680110
love潇洒小峰 SetTimer(hwnd, ID_TIMER, 1000, NULL);书上说,最后一个参数如果为空的话,是表示把WM_TIMER消息发送到消息队列里啊,应该是这样写的
4 年多之前 回复

SetTimer(hwnd, ID_TIMER, 1000, NULL);
书上说,最后一个参数如果为空的话,是表示把WM_TIMER消息发送到消息队列里啊,应该是这样写的

是不是同一个进程,如果不是断点肯定进不去

u013354805
ChenYuanshen 回复ChenYuanshen: 看看,这里有没有被调用到
4 年多之前 回复
u013354805
ChenYuanshen 回复love潇洒小峰: 我到现在还没遇到,通一个进程里面,断点进不去,要不你添加个打印看看
4 年多之前 回复
pipi6680110
love潇洒小峰 是同一个进程啊,没用多线程的
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问