#include "precomp.h" #include "ThreadEvent.h" const int WM_TEP_MESSAGE = WM_USER+101; // static members BOOL ThreadEventProxy::s_bWndClassRegistered = FALSE; const LPTSTR ThreadEventProxy::s_szWndClassName = "NAC_TEP_HIDDENWINDOW"; ThreadEventProxy::ThreadEventProxy(IStreamEventNotify *pNotify, HINSTANCE hInst) { WNDCLASSEX wndClass; if (s_bWndClassRegistered == FALSE) { ZeroMemory(&wndClass, sizeof(wndClass)); wndClass.cbSize = sizeof(wndClass); wndClass.style = CS_HREDRAW | CS_VREDRAW; wndClass.lpfnWndProc = WndProc; wndClass.hInstance = hInst; wndClass.lpszClassName = s_szWndClassName; RegisterClassEx(&wndClass); s_bWndClassRegistered = TRUE; } m_hwnd = CreateWindow(s_szWndClassName, "Hidden Window", WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, NULL, NULL, hInst, NULL); if (m_hwnd) SetWindowLongPtr(m_hwnd, GWLP_USERDATA, (LPARAM)this); m_pNotify = pNotify; return; } ThreadEventProxy::~ThreadEventProxy() { MSG msg; // just in case there is an outstanding message posted in the // queue for this window, clear the if (m_hwnd) { SetWindowLongPtr(m_hwnd, GWLP_USERDATA, 0); } while (PeekMessage(&msg, m_hwnd, 0, 0, PM_REMOVE)) { ; } DestroyWindow(m_hwnd); m_hwnd = NULL; } // static LPARAM ThreadEventProxy::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { ThreadEventProxy *pTEP; pTEP = (ThreadEventProxy*)GetWindowLongPtr(hwnd, GWLP_USERDATA); if (pTEP != NULL) { switch (uMsg) { case WM_TEP_MESSAGE: { // the message codes for the stream notifcation are // contained if (pTEP->m_pNotify) pTEP->m_pNotify->EventNotification(HIWORD(wParam), LOWORD(wParam), HIWORD(lParam), LOWORD(lParam)); return 0; } } } return DefWindowProc(hwnd, uMsg, wParam, lParam); } BOOL ThreadEventProxy::ThreadEvent(UINT uDirection, UINT uMediaType, UINT uEventCode, UINT uSubCode) { WPARAM wParam; LPARAM lParam; wParam = MAKELONG(uMediaType, uDirection); lParam = MAKELONG(uSubCode, uEventCode); if (m_hwnd) { PostMessage(m_hwnd, WM_TEP_MESSAGE, wParam, lParam); return TRUE; } return FALSE; }