【问题标题】:Responding to keypress and mouse click on fully-transparent panel响应按键和鼠标点击完全透明的面板
【发布时间】:2011-08-04 20:04:17
【问题描述】:

我创建了一个在整个屏幕上最大化的表单。

在该表单中,我放置了一个面板,面板的背景颜色设置为Red。表单的TransparencyKey 设置为Red

因此,面板就像一个“钥匙孔”——您可以看到它正下方的桌面。

当用户点击面板或按下键盘上的某个键时,我想采取行动。

但是,因为面板是完全透明的,所以当它被点击或按键时,什么都不会发生。如果我使面板不透明(例如,将其背景颜色设置为蓝色),它会响应点击。

让面板响应点击和按键的最佳方式是什么?

我必须在整个系统上挂钩所有鼠标和键盘事件还是有更简单的方法?

【问题讨论】:

    标签: c# keyboard mouse transparency


    【解决方案1】:

    面板不接受文本输入,你可以设置你的主窗体来处理按键事件。

    this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.form_KeyPress);
    

    http://screensnapr.com/v/VovWAi.png

    至于在面板上获取鼠标位置,可以使用 mouseclick 事件

    this.panel1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseClick);
    

    http://screensnapr.com/v/DB3kCQ.png

    我已经测试过了,它可以在全尺寸透明面板上运行

    【讨论】:

    • 这只适用于 Aero。在 XP 或禁用 Aero 的情况下,面板对鼠标单击是透明的。 Aero 行为是一个错误,但已经存在足够长的时间未修复成为“功能”。
    • @Hans-Passant 知道任何适用于 XP 或禁用 Aero 的技术吗?
    【解决方案2】:

    我发现我可以使用GetAsyncKeyState 来响应按键和鼠标点击。

    [DllImport("user32.dll")]
    public static extern int GetAsyncKeyState(System.Windows.Forms.Keys vKey);
    

    然后,我可以打电话给GetAsyncKeyState(Keys.LButton)GetAsyncKeyState(Keys.Escape),例如。比挂钩所有键盘和鼠标事件要简单得多。

    【讨论】:

      猜你喜欢
      • 2013-02-17
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      相关资源
      最近更新 更多