SetLayeredWindowAttributes с отключенным Aero

У меня есть программа, которая помещает прозрачное окно поверх рабочего стола, где пользователь может рисовать мышкой свободной рукой. Программа работает нормально до тех пор, пока Aero включен, но когда Aero отключен (в Windows 7), происходит сбой — я не могу нарисовать, и мышь не меняет форму мыши, которую я установил для окна.

Код выглядит так (MFC):

//=============================================================================
//    PreCreateWindow
//-----------------------------------------------------------------------------
//    Public function to create the window based on global properties
//=============================================================================
BOOL CDrawWnd::PreCreateWindow(CREATESTRUCT& cs)
{
HBRUSH   hBgBrush  = ::CreateSolidBrush(m_crBackgroundColor);
HCURSOR  hcursor = NULL;
if (m_uiCursor)
hcursor = AfxGetApp()->LoadCursor(m_uiCursor);
else if (m_Cursor)
hcursor = AfxGetApp()->LoadStandardCursor(m_Cursor); // By default IDC_CROSS

try
{
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW, hcursor, hBgBrush);
}
catch(.../*CResourceException ex*/)
{
/*ex.ReportError();*/
MessageBox(_T("AfxRegisterWndClass failed"));
}

return CWnd::PreCreateWindow(cs);
}//=============================================================================
//    CreateWnd
//-----------------------------------------------------------------------------
//    Public function to create the window based on global properties
//=============================================================================
bool CDrawWnd::CreateWnd()
{
CreateEx(WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TOOLWINDOW, _T("WsmLayeredWindowClass"), _T("Layered Draw Window"), WS_POPUP, m_StartWndRect, NULL, NULL, NULL);

if (m_hWnd)
{
// Make this window transparent
if (!SetLayeredWindowAttributes(m_crBackgroundColor, (255 * m_Transparency) / 100, LWA_COLORKEY))
{
TRACE(_T("\nSetLayeredWindowAttributes failed: 0x%lX"), GetLastError());
}

ShowWindow(SW_SHOW);

GetWindowRect(&m_rDrawingSurface);

return true;
}

return false;
}

CDrawWnd является производным от CWnd. CDrawWnd :: CreateWnd () вызывается для создания окна. В случае, если это не работает

SetLayeredWindowAttributes(m_crBackgroundColor, (255 * m_Transparency) / 100, LWA_COLORKEY)

не удается, даже если GetLastError () возвращает 0.

0

Решение

Задача ещё не решена.

Другие решения