0

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

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消息如果鼠标在窗口的透明区域?有没有办法让窗口的透明区域像彩色区域一样工作?

4

1 回答 1

0

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

几乎SetCursor(wc.hCursor)应该这样做。

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

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

还:

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

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

于 2013-09-29T13:52:27.947 回答