99 lines
1.9 KiB
C++
99 lines
1.9 KiB
C++
// CrossThreadsMessagingDevice.cpp
|
|
|
|
#include "stdafx.h"
|
|
#include "CrossThreadsMessagingDevice.h"
|
|
|
|
|
|
LPCTSTR CCrossThreadsMessagingDevice::m_lpszClassName = _T("CCrossThreadsMessagingDevice_HiddenWindow");
|
|
int CCrossThreadsMessagingDevice::m_iCount = 0;
|
|
|
|
|
|
CCrossThreadsMessagingDevice::CCrossThreadsMessagingDevice()
|
|
: m_hWnd(NULL), m_pMonitor(NULL)
|
|
{
|
|
if( m_iCount++ == 0 )
|
|
{
|
|
const WNDCLASS wc =
|
|
{
|
|
0,
|
|
HiddenWindowProc,
|
|
sizeof(DWORD) * 2,
|
|
sizeof(DWORD) * 2,
|
|
GetModuleHandle(NULL),
|
|
(HICON)NULL,
|
|
(HCURSOR)NULL,
|
|
(HBRUSH)(COLOR_WINDOW + 1),
|
|
(LPCTSTR)NULL,
|
|
m_lpszClassName
|
|
};
|
|
|
|
if( !RegisterClass(&wc) )
|
|
return;
|
|
}
|
|
|
|
m_hWnd = CreateWindow(
|
|
m_lpszClassName,
|
|
_T(""),
|
|
WS_OVERLAPPED,
|
|
0, 0, 0, 0,
|
|
(HWND)NULL,
|
|
(HMENU)NULL,
|
|
GetModuleHandle(NULL),
|
|
this
|
|
);
|
|
}
|
|
|
|
CCrossThreadsMessagingDevice::~CCrossThreadsMessagingDevice()
|
|
{
|
|
if( ::IsWindow(m_hWnd) )
|
|
DestroyWindow(m_hWnd);
|
|
|
|
if( --m_iCount == 0 )
|
|
{
|
|
UnregisterClass(m_lpszClassName, GetModuleHandle(NULL));
|
|
}
|
|
}
|
|
|
|
void CCrossThreadsMessagingDevice::Post(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
ASSERT(::IsWindow(m_hWnd));
|
|
PostMessage(m_hWnd, HWM_DATA, wParam, lParam);
|
|
}
|
|
|
|
LRESULT WINAPI CCrossThreadsMessagingDevice::HiddenWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
LRESULT rc = 0;
|
|
|
|
CCrossThreadsMessagingDevice* pThis =
|
|
(CCrossThreadsMessagingDevice*)GetWindowLong(hWnd, GWL_USERDATA);
|
|
|
|
switch( uMsg )
|
|
{
|
|
case WM_NCCREATE :
|
|
{
|
|
LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam;
|
|
ASSERT(lpcs->lpCreateParams != NULL);
|
|
SetWindowLong(hWnd, GWL_USERDATA, (LONG)lpcs->lpCreateParams);
|
|
rc = TRUE;
|
|
break;
|
|
}
|
|
|
|
case HWM_DATA :
|
|
{
|
|
ASSERT(pThis != NULL);
|
|
if( pThis->m_pMonitor )
|
|
pThis->m_pMonitor->OnCrossThreadsMessage(wParam, lParam);
|
|
break;
|
|
}
|
|
|
|
default :
|
|
{
|
|
rc = DefWindowProc(hWnd, uMsg, wParam, lParam);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return rc;
|
|
}
|
|
|