windows-nt/Source/XPSP1/NT/shell/shell32/uevttmr.h
2020-09-26 16:20:57 +08:00

101 lines
3.1 KiB
C++

#ifndef _UEVTTMR_H
#define _UEVTTMR_H
#include "dpa.h"
typedef struct
{
HWND hWnd;
UINT uCallbackMessage;
ULONG uUserEventTimerID;
UINT uTimerElapse;
UINT uIntervalCountdown;
IUserEventTimerCallback * pUserEventTimerCallback;
BOOL bFirstTime;
}
USEREVENTINFO;
#define MIN_TIMER_THRESHOLD 0.1
#define MAX_TIMER_THRESHOLD 0.01
class CUserEventTimer : public IUserEventTimer
{
public:
// *** IUnknown ***
STDMETHODIMP QueryInterface(REFIID riid, void ** ppvObj);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// *** IUserEventTimer ***
STDMETHODIMP SetUserEventTimer( HWND hWnd,
UINT uCallbackMessage,
UINT uTimerElapse,
IUserEventTimerCallback * pUserEventTimerCallback,
ULONG * puUserEventTimerID);
STDMETHODIMP KillUserEventTimer(HWND hWnd, ULONG uUserEventTimerID);
STDMETHODIMP GetUserEventTimerElapsed(HWND hWnd, ULONG uUserEventTimerID, UINT * puTimerElapsed);
STDMETHODIMP InitTimerTickInterval(UINT uTimerTickIntervalMs);
CUserEventTimer();
virtual ~CUserEventTimer();
HRESULT Init();
static STDMETHODIMP_(int) s_DeleteCB(LPVOID pData1, LPVOID pData2);
LRESULT v_WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam);
protected:
static const UINT_PTR TIMER_ID = 1000;
static const UINT TIMER_ELAPSE = 5000; // 5 seconds
static const ULONG MIN_TIMER_ID = 0x00001000;
static const ULONG MAX_TIMER_ID = 0xDDDD1000;
// static const DWORD MIN_TIMER_LENGTH = 4500; // 4.5 seconds
// static const DWORD MAX_TIMER_LENGTH = 5002; // 5 seconds + 2 milliseconds
static LRESULT CALLBACK s_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL _CreateWindow();
void _Destroy();
void _OnTimer();
void _KillIntervalTimer();
int _GetTimerDetailsIndex(HWND hWnd, ULONG uUserEventTimerID);
HRESULT _SetUserEventTimer( HWND hWnd, UINT uCallbackMessage,
UINT uNumIntervals, IUserEventTimerCallback * pUserEventTimerCallback,
ULONG * puUserEventTimerID);
HRESULT _ResetUserEventTimer(HWND hWnd, UINT uCallbackMessage, UINT uNumIntervals,
int nIndex);
ULONG _GetNextInternalTimerID(HWND hWnd);
inline BOOL _IsAssignedTimerID(HWND hWnd, ULONG uUserEventTimerID)
{
return (_GetTimerDetailsIndex(hWnd, uUserEventTimerID) >= 0);
}
inline UINT _CalcNumIntervals(UINT uTimerElapse)
{
return (UINT)(uTimerElapse/m_uTimerTickInterval);
}
inline UINT _CalcMilliSeconds(UINT uIntervalCountdown)
{
return (UINT) (uIntervalCountdown*m_uTimerTickInterval);
}
LONG m_cRef;
CDPA<USEREVENTINFO> _dpaUserEventInfo;
UINT_PTR _uUserTimerID;
HWND m_hWnd;
DWORD m_dwUserStartTime;
UINT m_uTimerTickInterval;
};
#endif // _UEVTTMR_H