未经测试
听起来你的问题正在点击。为了传递您的鼠标消息,您是否考虑过拦截鼠标单击顶部窗口(假设已将其设置为透明窗口),然后隐藏您的窗口,使用 user32 import SendMessage 触发相同的鼠标消息,然后再次显示您的窗口?如果你不想隐藏你的窗口,你可以直接调用 SendMessage 到其他各种窗口句柄。
以下链接显示了如何循环浏览应用程序桌面上的窗口:
http://support.microsoft.com/kb/183009
如果您已经使表单透明,我认为您也可以覆盖 CreateParams。这样做可能会允许鼠标事件通过。
// This may be even simpler
protected override CreateParams CreateParams
{
get
{
CreateParams createParams = base.CreateParams;
createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
return createParams;
}
}
您可以在较新的 windows 窗体中使窗体本身透明,例如:
public void MakeSeeThru()
{
frmTransparentForm.Opacity = 0.83;
}
以上仅适用于表单。在子控件上执行此操作需要更多的工作。首先,您必须设置样式以支持透明背景色。
public TransparentControl()
{
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = Color.Transparent.
}
如果控件是透明的,这不会阻止您重写 OnPaintBackground 和 OnPaint 方法并根据需要进行自定义绘图。它只是使用默认的透明背景绘制。
我以前做过这个,如果它移动会有一点模糊。但是,如果整个东西是一个巨大的透明形式,覆盖您的桌面,则应该没有运动模糊。
如果这有性能问题并且您想自定义绘制桌面,您可以截取如下屏幕截图:
ScreenCapture sc = new ScreenCapture();
// capture entire screen, and save it to a file
Image img = sc.CaptureScreen();
不过,您需要先隐藏表单,这样可能会导致闪烁。