【问题标题】: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;
}
}