У меня есть многослойное окно, имеющее размер экрана, но почти полностью прозрачное. (кроме небольшого крестика, нарисованного пользователем)
wc.style = 0;
wc.lpfnWndProc = (WNDPROC) wnd_top_rect_proc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(hInst, IDC_CROSS);
wc.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName= L"POGO_WND_TOP";
RegisterClass(&wc);
hWnd = CreateWindowEx(
WS_EX_TOPMOST | WS_EX_LAYERED,
L"POGO_WND_TOP", //class name
NULL, //wnd name
WS_POPUP, //style
0, 0, //x, y
screen.right-screen.left,//w
screen.bottom-screen.top,//h
g_hWnd, //parent
NULL, //menu
hInst, //instance
NULL); //lparam
SetLayeredWindowAttributes(hWnd, WND_TOP_BG, 0, LWA_COLORKEY);
ShowWindow(hWnd, SW_SHOW);
Как я могу установить собственный курсор для этого окна или для всего рабочего стола? Я указал курсор класса в классе окна, но он не отображает его (я ожидаю, что это из-за прозрачности)
Кроме того, я хотел бы знать, как на самом деле управляется прозрачность в окнах: почему я не могу получить WM_LBUTTON
сообщения, если мышь находится в прозрачной области окна? Нет ли способа заставить прозрачные области окна работать так же, как цветные области?
Чтобы установить курсор, вы используете неожиданно названную функцию SetCursor
.
Довольно много SetCursor(wc.hCursor)
должен сделать это.
Это общий ресурс, поэтому вам не следует менять курсор для области за пределами вашего собственного окна. Или, как это указано в ссылке:
Курсор является общим ресурсом. Окно должно установить форму курсора
только когда курсор находится в своей клиентской области или когда окно
захват ввода мыши. В системах без мыши окно должно
восстановить предыдущий курсор до того, как курсор покинет клиентскую область
или до того, как он передаст управление другому окну.
Также:
Если ваше приложение должно установить курсор, пока оно находится в окне, сделайте
убедитесь, что курсор класса для указанного класса окна установлен в NULL.
Если курсор класса не равен NULL, система восстанавливает курсор класса
каждый раз, когда мышь двигается.
Я не слишком углубился в это, я ожидаю, что полностью прозрачная область окна на самом деле не захватывает щелчки мышью, так как из этого окна ничего не видно [конечно, вы теоретически можете щелкнуть невидимые вещи, но Одной из точек прозрачности является создание окон, которые имеют странные формы, и если вы должны были позволить приложению обрабатывать обнаружение «это у меня в окне или у парня подо мной», вы можете увидеть, как это может стать неуправляемым — так если окно не вносит вклад в фактический «отображаемый материал», щелчки мыши должны быть переданы в нижний слой, который обеспечивает вклад (другими словами, не является прозрачным на 100%)]. Итак, в соответствии с комментарием, попробуйте установить значение прозрачности «на ступеньку ниже 100% прозрачности».
Других решений пока нет …