【问题标题】:Bypass mouse events for Winforms using c#使用 c# 绕过 Winforms 的鼠标事件
【发布时间】:2020-11-17 10:44:54
【问题描述】:

我已经使用以下代码加载了一个 Winform,具有半透明效果。

    frmTest frm=new frmTest();
    frm.Opacity = 0.051;
    frm.Left = 0;
    frm.Top = 0;
    frm.Width= Screen.PrimaryScreen.Bounds.Width;
    frm.Height= Screen.PrimaryScreen.Bounds.Height;
    frm.Show();

现在我正在寻找某种方法来绕过我的表单以响应鼠标点击。例如,表单以半透明方式显示在桌面上,用户单击表单,桌面应该获得鼠标点击而不是我的表单。我的表单只需要对用户可见,但不会与它发生冲突。

我尝试禁用我的表单,但不知道如何将鼠标事件传递到我的表单下方的桌面或其他程序。有人可以指出我正确的方向来解决这个问题吗?

【问题讨论】:

  • 检查这个线程:stackoverflow.com/a/11043661/2109769 他们使标签半透明,同样的事情可能适用于表单。
  • @Quercus 我这样试过。它获取 API 调用但不绕过鼠标事件。公共类转换:表格{私有常量int WM_NCHITTEST = 0x84;私有 const int HTTRANSPARENT = -1; protected override void WndProc(ref Message message) { if (message.Msg == (int)WM_NCHITTEST) message.Result = (IntPtr)HTTRANSPARENT;否则 base.WndProc(参考消息); } }
  • 你没有提到这个表单的用途。用户应该与之交互吗?它有什么作用?如果它不需要做任何特定的事情,它只是叠加排序,您可以使用每像素 Alpha 分层形式 - 将 WS_EX_TRANSPARENT 添加到样式中 - 并在其表面上绘制图像。表单现在不可触摸,即使它看起来像有一个表面,一切都会通过。如果您只需要表单的框架并且 ClientArea 可以是透明的,请使用红色的 TrasparencyKey 颜色(洋红色是特殊)。
  • @Jimi 我的表单包含一些控件,可以及时更新一些信息,并且它们中的任何一个都不是用户难以处理的。仅用于显示结果和一些小动画。我无法执行诸如反向缓冲之类的操作,因为我的表单只会在可见屏幕区域正确加载其内容。
  • 我描述的这两种方法都会给你。 1) 分层透明表单不能以任何方式进行交互,但它不能在其表面上显示控件:您必须在位图上绘制您想要显示的内容,然后在表单的表面上绘制位图(您只能更新位图的一部分)。 2) 使用 BackgroundColor + TransparencyKey 设置为 Magenta,您有一个带有完全透明 ClientArea 的表单,可以点击。您可以在表单的表面上拥有控件,并且可以根据需要与这些控件进行交互。

标签: c# forms winforms click mouseevent


【解决方案1】:

也许是这样的:

  1. 捕获所有鼠标事件
  2. 隐藏您的表单frm.Visible = false;
  3. 触发与捕获的鼠标事件相同的鼠标事件(参见How can I simulate a mouse click at a certain position on the screen?
  4. 显示您的表格frm.Visible = true;

【讨论】:

  • 感谢您的好主意。但我想它会在每个鼠标事件上闪烁屏幕,例如鼠标移动、拖动等。我正在寻找某种方式来显示表单而不会发生任何用户冲突。 “我的表单只需要对用户可见,但不会与它发生冲突。”
  • 为避免闪烁,请暂停绘图并在之后恢复绘图:stackoverflow.com/questions/487661/…
猜你喜欢
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 2011-06-22
  • 2013-01-04
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
相关资源
最近更新 更多