如何让窗口半透明,总在最前,但不接收输入?

来源:百度知道 编辑:UC知道 时间:2024/06/24 13:44:43
两个问题
1\ 窗口半透明
2\ 总在最前, 但是不接受鼠标接盘输入, 就是把所有消息都"漏"下去 像不存在一样....
谢谢!
有vb vc的实现方法皆可
试了一下 disable window 之后 点击鼠标会当当当的响 而且把消息都拦截了(下面的窗口没有接收到点击)
是不是可以用sendinput之类的函数把消息传下去呢 或者干脆不接受~~~ 谢谢了~~

刚想到一个, 就是qq音乐的桌面歌词, 锁定之后, 就只显示, 点击在上面就和窗口不存在一样, 点到了下面的窗口或是桌面 所以我想应该有一个比较简洁的方法实现这个功能

基本上不可能有常规的方法。1.半透明窗口只有在完全透明的时候才不接受输入(普通窗口永远接受输入);2.只有依赖窗口才能获得重画的消息;3.系统重画画半透明窗口的时候不会给程序任何通知。

可能的解决... 1. 拦截所有窗口变化消息,自己判断重画... 麻烦不说,杀毒软件这关不好过...;2. 半透明窗口接到鼠标事件以后,向下发送... 理论上应该比上一个还麻烦,而且窗口闪...;3.其他方法

---

SendInput以后接受消息的还是原来的窗口,只会造成死循环而已。这个不写驱动应该是没有什么效果可以接受的实现方法的。

---

这次我也学到了... 刚注意到WS_EX_TRANSPARENT对于layered windows有特殊含义。如果一个窗口同时有WS_EX_TRANSPARENT和WS_LAYERED它就不会接受鼠标事件(注意WS_EX_TRANSPARENT对于普通窗口完全是另外一个意思。) 也谢谢你了,如果你不问我可能再过几年也不会注意到这个TvT

例子

void main()
{
WNDCLASS wc = {0};

HINSTANCE inst = GetModuleHandleW(0);

wc.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);
wc.hCursor = LoadCursor(inst, IDC_ARROW);
wc.hInstance = inst;
wc.lpfnWndProc = DefWindowProcW;
wc.lpszClassName = L"1234";
wc.style = CS_HREDRAW | CS_VREDRAW;

RegisterClassW(&wc);

HWND h = CreateWindowExW(WS_EX_TRANSPARENT | WS_EX_LAYERED | WS_EX_TOPMOST,