Link to home
Start Free TrialLog in
Avatar of viper_gts
viper_gtsFlag for Hong Kong

asked on

Create and Receive Timer Event in WIN32 DLL

Dear Experts:

I would like to know if there is any ways to create a Timer say 500ms and a Timer Event Handler in a traditional WIN32 DLL??

If sample code can provide will be even better.

Thanks in advance

Viper Venom
Avatar of Roshan Davis
Roshan Davis
Flag of United States of America image

MSDN Says

Creating a Timer
The following example uses the SetTimer function to create two timers. The first timer is set for every 10 seconds, the second for every 5 minutes.

// Set two timers.
 
SetTimer(hwnd,             // handle to main window
    IDT_TIMER1,            // timer identifier
    10000,                 // 10-second interval
    (TIMERPROC) NULL);     // no timer callback
 
SetTimer(hwnd,             // handle to main window
    IDT_TIMER2,            // timer identifier
    300000,                // 5-minute interval
    (TIMERPROC) NULL);     // no timer callback
To process the WM_TIMER messages generated by these timers, add a WM_TIMER case statement to the window procedure for the hwnd parameter.

case WM_TIMER:
 
    switch (wParam)
    {
        case IDT_TIMER1:
            // Process the 10-second timer.
 
             return 0;
 
        case IDT_TIMER2:
            // Process the 5-minute timer.

            return 0;
    }
An application can also create a timer whose WM_TIMER messages are processed not by the main window procedure but by an application-defined callback function, as in the following code sample, which creates a timer and uses the callback function MyTimerProc to process the timer's WM_TIMER messages.

// Set the timer.
 
SetTimer(hwnd,                // handle to main window
    IDT_TIMER3,               // timer identifier
    5000,                     // 5-second interval
    (TIMERPROC) MyTimerProc); // timer callback
The calling convention for MyTimerProc must be based on the TimerProc callback function.

If your application creates a timer without specifying a window handle, your application must monitor the message queue for WM_TIMER messages and dispatch them to the appropriate window. Note that GetMessage can return -1 if there is an error.

HWND hwndTimer;   // handle to window for timer messages
MSG msg;          // message structure
 
    while (GetMessage(&msg, // message structure
            NULL,           // handle to window to receive the message
            NULL,           // lowest message to examine
            NULL)          // highest message to examine
           != 0 && GetMessage(&msg, NULL, NULL, NULL) != -1)
    {
 
        // Post WM_TIMER messages to the hwndTimer procedure.
 
        if (msg.message == WM_TIMER)
        {
            msg.hwnd = hwndTimer;
        }
 
        TranslateMessage(&msg); // translates virtual-key codes
        DispatchMessage(&msg);  // dispatches message to window
    }

GOOD LUCK
MSDN Says

Creating a Timer
The following example uses the SetTimer function to create two timers. The first timer is set for every 10 seconds, the second for every 5 minutes.

// Set two timers.
 
SetTimer(hwnd,             // handle to main window
    IDT_TIMER1,            // timer identifier
    10000,                 // 10-second interval
    (TIMERPROC) NULL);     // no timer callback
 
SetTimer(hwnd,             // handle to main window
    IDT_TIMER2,            // timer identifier
    300000,                // 5-minute interval
    (TIMERPROC) NULL);     // no timer callback
To process the WM_TIMER messages generated by these timers, add a WM_TIMER case statement to the window procedure for the hwnd parameter.

case WM_TIMER:
 
    switch (wParam)
    {
        case IDT_TIMER1:
            // Process the 10-second timer.
 
             return 0;
 
        case IDT_TIMER2:
            // Process the 5-minute timer.

            return 0;
    }
An application can also create a timer whose WM_TIMER messages are processed not by the main window procedure but by an application-defined callback function, as in the following code sample, which creates a timer and uses the callback function MyTimerProc to process the timer's WM_TIMER messages.

// Set the timer.
 
SetTimer(hwnd,                // handle to main window
    IDT_TIMER3,               // timer identifier
    5000,                     // 5-second interval
    (TIMERPROC) MyTimerProc); // timer callback
The calling convention for MyTimerProc must be based on the TimerProc callback function.

If your application creates a timer without specifying a window handle, your application must monitor the message queue for WM_TIMER messages and dispatch them to the appropriate window. Note that GetMessage can return -1 if there is an error.

HWND hwndTimer;   // handle to window for timer messages
MSG msg;          // message structure
 
    while (GetMessage(&msg, // message structure
            NULL,           // handle to window to receive the message
            NULL,           // lowest message to examine
            NULL)          // highest message to examine
           != 0 && GetMessage(&msg, NULL, NULL, NULL) != -1)
    {
 
        // Post WM_TIMER messages to the hwndTimer procedure.
 
        if (msg.message == WM_TIMER)
        {
            msg.hwnd = hwndTimer;
        }
 
        TranslateMessage(&msg); // translates virtual-key codes
        DispatchMessage(&msg);  // dispatches message to window
    }

GOOD LUCK
Avatar of viper_gts

ASKER

Thank you for such a fast response.

Please correct me if I am wrong but I think in a traditional WIN32 does not have a window own by itself.

Therefore, both way cannot be implement in this case.

Viper Venom
ASKER CERTIFIED SOLUTION
Avatar of fl0yd
fl0yd

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of fl0yd
fl0yd

p.s.: Took me toooooo long to type.....

What exactly do you mean by 'traditional WIN32'? I assume, you're talking about an command-line-application without a GUI. You can still use ::SetTimer(...), as you don't have to specify a window handle. In that case make sure to provide your own callback-function.

.f
You can set NULL, for window, So u can set only one timer, But in ur case this may okay... right ?

Roshmon
Actually, I am trying to write a small test program and see if it works.

Thank you for all you help.

Viper Venom
fl0yd: This method will only work if the program which launches the DLL has a message loop. 99% of Windows programs DO have a message loop, of course, but I'm not sure you can guarantee this when the timer is being used in a DLL.