我正在尝试在C#中创建一个完全透明的表单,但不允许点击通过它到下面的其他窗口。 我找到了两种有希望的方法,但没有达到我想要的结果。
第一种方法是将背景颜色和透明度键设置为相同的值。这为我提供了透明的表单,但点击完成。
this.BackColor = Color.Red;
this.TransparencyKey = Color.Red;
我尝试的另一件事是将表单的不透明度设置为1%。这创造了我想要的效果 - 几乎。我得到一个99%透明的形式,但是对于窗体下面的任何东西都有轻微的颜色变化。由于我正在制作的应用程序旨在用于颜色敏感的上下文(图形设计等),即使是颜色的微小改变也是不可接受的。亲爱的,所以我转向你。可以这样做吗?
答案 0 :(得分:2)
我找到了解决方案,我也和你们分享了。
答案很简单:我设置:this.TransparencyKey = Color.Lime;
然后我使用1x1px Lime PNG作为背景图像。这还有一个额外的好处,就是不会模糊表单边框和标题栏。我将在稍后删除它们,但目前,知道表单的位置是有用的。
答案 1 :(得分:2)
我完全意外地找到了解决方法。
我希望点击透明窗口并使用此SO问题中的答案获得它:
C# cursor highlighting/follower
该答案使用LightGreen的透明度过滤器,但我认为我可能需要使用该颜色,所以我将其更改为AliceBlue并点击停止工作。我换回LightGreen,它又开始工作了。
答案 2 :(得分:1)
您可以尝试在系统范围内捕获鼠标操作(点击,移动)并根据需要处理它们,而不是尝试在透明表单上捕获鼠标操作。
答案 3 :(得分:1)
这可以通过以下方式完成(假设绘制的表格保持最大化。如果没有,请参阅下面的下一段):
虽然上述解决方案可以解决您的问题,但您需要回答以下问题:
但是,如果您想调整此表单的大小(只是注意到您使用新屏幕截图编辑),那么您需要剪切截屏的部分并将其显示为表单的背景。但是这更进一步:每次调整表单大小或移动时都需要这样做。
我个人会采取第一种(更简单的)方法。
答案 4 :(得分:0)
您可以设置钩子来捕捉鼠标事件。
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);
[StructLayout(LayoutKind.Sequential)]
public class MouseStruct
{
public Point pt;
public int hwnd;
public int wHitTestCode;
public int dwExtraInfo;
}
public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
private int hHook;
public const int WH_MOUSE_LL = 14;
public static HookProc hProc;
public int SetHook()
{
hProc = new HookProc(MouseHookProc);
hHook = SetWindowsHookEx(WH_MOUSE_LL, hProc, IntPtr.Zero, 0);
return hHook;
}
public void UnHook()
{
UnhookWindowsHookEx(hHook);
}
//callback function, invoked when there is an mouse event
private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
var MyMouseStruct = (MouseStruct)Marshal.PtrToStructure(lParam, typeof(MouseStruct));
if (nCode < 0)
{
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
else
{
switch wParam{
case (IntPtr)513:
//click
//do whatever you want
case (IntPtr)512:
//move
case (IntPtr)514:
//release
default:
}
Cursor.Position = MyMouseStruct.pt;
//stop the event from passed to other windows.
return 1;
}
}
MSDN的更多详情。