C# 表单应该是透明的,并且点击通过-但是仍然接收dragdrop事件

C# 表单应该是透明的,并且点击通过-但是仍然接收dragdrop事件,c#,.net,winforms,C#,.net,Winforms,我有一个表单,我覆盖在另一个表单上,并使用透明键将其设置为透明,然后单击可穿透,跟踪其他表单的位置并将其设置为父级。一切都很好,很愉快 我真正想要的是这个透明且可点击的表单能够接收拖放事件,但我怀疑使用TransparencyKey意味着所有鼠标事件都可以点击,包括拖放 到目前为止,我还无法用谷歌搜索自己,所以我想知道这里是否有人会知道得更清楚 非常感谢,, 伊恩。 从文章中转换为C Win32 API: DLL导入 例子 这当然行不通。如果需要“DropAnywhere”支持,则通过

我有一个表单,我覆盖在另一个表单上,并使用透明键将其设置为透明,然后单击可穿透,跟踪其他表单的位置并将其设置为父级。一切都很好,很愉快

我真正想要的是这个透明且可点击的表单能够接收拖放事件,但我怀疑使用TransparencyKey意味着所有鼠标事件都可以点击,包括拖放

到目前为止,我还无法用谷歌搜索自己,所以我想知道这里是否有人会知道得更清楚

非常感谢,, 伊恩。

从文章中转换为C

Win32 API:
DLL导入 例子
这当然行不通。如果需要“DropAnywhere”支持,则通过底部窗体的控件递归,并设置它们的AllowDrop和D+D事件处理程序。
[DllImport("user32.dll", EntryPoint = "GetWindowLongA", SetLastError = true)]
private static extern int GetWindowLong(IntPtr hwnd, int nIndex);

[DllImport("user32.dll", EntryPoint = "SetWindowLongA", SetLastError = true)]
private static extern int SetWindowLong(IntPtr hwnd, int nIndex, int dwNewLong);

[DllImport("user32.dll")]
private static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);
private const int GWL_EXSTYLE = -20;
private const int WS_EX_LAYERED = 0x80000;
private const int WS_EX_TRANSPARENT = 0x20;
private const int LWA_ALPHA = 2;
private const int LWA_COLOR_KEY = 1;

var style = GetWindowLong(this.Handle, GWL_EXSTYLE)

SetWindowLong(this.Handle, GWL_EXSTYLE, 
                  style | WS_EX_LAYERED | WS_EX_TRANSPARENT)

var percent = 0.7
var alpha = 255 * percent
SetLayeredWindowAttributes(this.Handle, 0, alpha, LWA_ALPHA)