2013-09-29 33 views
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); 

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

+0

将透明度设置为1而不是0. –

回答

0

要设置光标,请使用出人意料地明显命名的函数SetCursor

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

这是一个共享资源,所以你真的不应该改变你自己窗口以外的区域的光标。或者,因为它放在链接中:

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

另外:

如果您的应用程序必须设置光标,而它在一个窗口,让 确保类光标指定的窗口的类设置为NULL。 如果类光标不为NULL,则系统每次移动鼠标时恢复类光标 。

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

+0

SetCursor不起作用,因为其他窗口会将其重新设置为另一个光标。关于窗口透明度,我们可以放一些布尔值,让我们启用/禁用窗口形状的自我控制,但我想这不是窗口的工作方式。 –

+0

因此,当您的窗口焦点时,您需要调用' SetCursor'。我很确定在框架中有这方面的支持。 –

+0

嗯,我实际上最终只是做了一个经典的窗口,而不是一个分层的,用NULL_BRUSH作为背景,并销毁/重新创建它(无论如何我必须)。但我仍然很高兴找到一种方法来像普通窗口一样控制透明窗口,奇怪的是我找不到任何有关它的信息。 –