Установка курсора на весь рабочий стол

У меня есть многослойное окно, имеющее размер экрана, но почти полностью прозрачное. (кроме небольшого крестика, нарисованного пользователем)

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 сообщения, если мышь находится в прозрачной области окна? Нет ли способа заставить прозрачные области окна работать так же, как цветные области?

1 ответ

Решение

Чтобы установить курсор, вы используете неожиданно названную функцию SetCursor,

Довольно много SetCursor(wc.hCursor) должен сделать это.

Это общий ресурс, поэтому вам не следует менять курсор для области за пределами вашего собственного окна. Или, как это указано в ссылке:

Курсор является общим ресурсом. Окно должно устанавливать форму курсора, только когда курсор находится в своей клиентской области или когда окно захватывает ввод мыши. В системах без мыши окно должно восстановить предыдущий курсор до того, как курсор покинет клиентскую область или до того, как он передаст управление другому окну.

Также:

Если ваше приложение должно установить курсор, когда оно находится в окне, убедитесь, что курсор класса для указанного класса окна установлен в NULL. Если курсор класса не равен NULL, система восстанавливает курсор класса при каждом перемещении мыши.

Я не слишком углубился в это, я ожидаю, что полностью прозрачная область окна на самом деле не фиксирует щелчки мышью, так как из этого окна ничего не видно [конечно, вы можете теоретически щелкать невидимые вещи, но Одной из точек прозрачности является создание окон, которые имеют странные формы, и если вы должны были позволить приложению обрабатывать обнаружение "это у меня в окне или у парня подо мной", вы можете увидеть, как это может стать неуправляемым - так если окно не вносит вклад в фактический "отображаемый материал", щелчки мыши должны быть переданы в нижний слой, который обеспечивает вклад (другими словами, не является прозрачным на 100%)]. Итак, в соответствии с комментарием, попробуйте установить значение прозрачности "на ступеньку ниже 100% прозрачности".

Другие вопросы по тегам