【问题标题】:Hiding form when are other controls focus其他控件何时成为焦点时隐藏表单
【发布时间】:2012-02-14 12:21:57
【问题描述】:

此问题与this my question 有关。现在我的课堂上有表格,当用户点击按钮时,我会显示(或隐藏)表格。没关系。但是当我使用原始表单移动或单击原始表单中的某个位置时,我想隐藏表单。新形式在原始形式的后面。我正在尝试像 lostfocus 和其他事件,但它没有帮助。所以我认为我需要一些技巧来检查我的控制是否有点击父表单(原始表单)或其他一些黑客。我知道最好的办法是我输入代码,但我有很多行,所以我认为最好的方法是如果你以一般方式帮助我,然后我尝试应用到我的应用程序。

【问题讨论】:

    标签: c# windows winforms visual-studio-2008 focus


    【解决方案1】:

    您可以使用全局鼠标和键盘hook 完成此操作。事实上,它已被包含在有据可查、结构良好的 .NET API 中,地址为 CodePlex

    去那里下载它。然后,设置一个全局鼠标钩子:

        _mouseListener = new MouseHookListener(new GlobalHooker());
        _mouseListener.MouseMove += HandleGlobalHookMouseMove;
        _mouseListener.Start();
    

    这里的关键是,只要鼠标在桌面上的任何位置移动,您都会收到 MouseMove 事件,而不仅仅是在窗口范围内。

     private void HandleAppHookMouseMove(object sender, MouseEventArgs e)
     {
    
            if (this.Bounds.Contains(e.Location))
            {
                  HandleEnter();
            }
            else
            {
                  HandleLeave();
            }          
      }
    

    您也可以为MouseClick 设置一个。两者的结合将使您能够确定鼠标移动到原始表单上的任何时间,或者鼠标在其上方时单击。与LostFocus 和您尝试的其他事件不同,焦点无关紧要。

    【讨论】:

      【解决方案2】:

      下面有帮助吗?

      public partial class Form1 : Form
      {
          Form f2 = new Form2();
          public Form1()
          {
              InitializeComponent();
              f2.Show();
          }
      
          private void Form1_MouseMove(object sender, MouseEventArgs e)
          {
              if (this.ClientRectangle.Contains(e.Location) && f2.Visible) { f2.Hide(); }
          }
      
          private void button1_Click(object sender, EventArgs e)
          {
              f2.Visible = !f2.Visible ? true : false;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-10
        • 1970-01-01
        • 2013-09-27
        • 1970-01-01
        • 2012-09-17
        • 1970-01-01
        相关资源
        最近更新 更多