为整个桌面设置光标

时间:2013-09-29 12:38:53

标签: c++ windows cursor layered-windows

我有一个分层窗口,具有屏幕大小,但几乎完全透明。 (除了用户点击的一个小十字架)

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);

如何为此窗口或整个桌面设置自定义光标?我在窗口类中指定了一个类游标,但它没有显示它(我希望这是因为透明度)
另外,我想知道在windows中实际上是如何实现透明的:如果鼠标位于窗口的透明区域,为什么我不能获得WM_LBUTTON消息?难道没有办法让窗户的透明区域像彩色区域一样工作吗?

1 个答案:

答案 0 :(得分:0)

要设置光标,请使用令人惊讶的明显命名的函数SetCursor

非常SetCursor(wc.hCursor)应该这样做。

它是一个共享资源,因此您不应该更改自己窗口之外的区域的光标。或者,因为它放在链接中:

  

游标是共享资源。窗口应设置光标形状   仅当光标位于其客户区域或窗口时   捕获鼠标输入。在没有鼠标的系统中,窗口应该是   在光标离开客户区之前恢复上一个光标   或者在放弃对另一个窗口的控制之前。

此外:

  

如果您的应用程序必须在窗口中设置光标,请执行   确保指定窗口类的类游标设置为NULL。   如果类游标不为NULL,则系统将恢复类游标   每次移动鼠标。

我没有深入研究它,我希望窗口的完全透明区域实际上不会捕获鼠标点击,因为从那个窗口看不到任何东西[当然,理论上你可以点击隐形事情,但透明点之一是创建奇怪形状的窗口,如果你不得不让应用程序处理“它在我的窗口或我下面的人”的检测,你可以看到如何获得管理不善 - 因此,如果窗口没有对实际的“显示内容”做出贡献,则应将鼠标点击传递到下面的层,这将提供贡献(换句话说,不是100%透明)]。因此,根据评论,尝试将透明度值设置为“距离100%透明度仅一个档次”。