C# 同时实现窗体透明、鼠标穿透与嵌入桌面
正在写一个程序,希望实现窗体半透明和鼠标穿透功能,同时嵌入桌面,用了以下接口代码:
[DllImport("user32", EntryPoint = "SetWindowLong")]
private static extern uint SetWindowLong(IntPtr hwnd, int nIndex, uint dwNewLong);
[DllImport("user32", EntryPoint = "GetWindowLong")]
private static extern uint GetWindowLong(IntPtr hwnd, int nIndex);
private const uint WS_EX_LAYERED = 0x80000;
private const int WS_EX_TRANSPARENT = 0x20;
private const int GWL_STYLE = (-16);
private const int GWL_EXSTYLE = (-20);
private void CanPenetrate(bool b)
{
uint intExTemp = GetWindowLong(this.Handle, GWL_EXSTYLE);
//uint oldGWLEx = SetWindowLong(this.Handle, GWL_EXSTYLE, WS_EX_LAYERED | WS_EX_TRANSPARENT);
uint oldGWLEx;
if (b)
oldGWLEx = SetWindowLong(this.Handle, GWL_EXSTYLE, intExTemp | WS_EX_TRANSPARENT| WS_EX_LAYERED);/////////穿透+透明
else
oldGWLEx = SetWindowLong(this.Handle, GWL_EXSTYLE, intExTemp | WS_EX_LAYERED);//透明
}
同时设置窗口的Opacity属性可以实现鼠标穿透和窗口透明。
同时这个方法:
[DllImport("User32.dll",EntryPoint="FindWindow")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32")]
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
//在构造函数中或者Load中
IntPtr hDeskTop=FindWindow("Progman", null);
SetParent(this.Handle,hDeskTop);
可以实现将窗体嵌入桌面,即按显示桌面不会消失。
但当把两个功能都用上的时候发现在设置Opacity属性时出现错误:
System.ComponentModel.Win32Exception: 参数不正确。
在 System.Windows.Forms.Form.UpdateLayered()
在 System.Windows.Forms.Form.set_Opacity(Double value)
在 事务提醒.Form1.Form1_Load(Object sender, EventArgs e) 位置 e:\Visual Studio 2008\Projects\事务提醒\事务提醒\Form1.cs:行号 180
不设置opacity的话就能成功嵌入桌面,但这样透明效果就没了(附带一句,我用的是vista)。
有没有人用过这两个方法,有碰到类似的问题吗?希望懂的帮忙解决下问题,谢谢了!
------解决方案--------------------WS_EX_TRANSPARENT
这个参数就是这设置透明度的啊
------解决方案--------------------Transparent, Click-Through Forms
http://www.codeproject.com/KB/vb/ClickThroughWindows.aspx
------解决方案--------------------http://win.51aspx.com/CV/RotateTransformDemo/
------解决方案--------------------
透明只限于顶层窗体.嵌入桌面后,该窗体已经变成子窗体.
比较有效的方法是不嵌入窗体,只是拦截系统消息,屏蔽相关热键对自身窗体产生的消息.