如何禁用Windows窗体上的hittests?
如果您正在与另一个进程通话,则需要发送和检索Windows消息。
看一看这个链接:
使用窗口消息来实现全球系统钩子在C# http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx
全球系统钩子允许应用程序拦截用于其他应用程序的Windows消息。这一直是困难的(根据MSDN,不可能)在C#中实现。本文试图通过在C++中创建一个DLL封装器来实现全局系统挂钩,该封装器将消息发布到挂钩应用程序的消息队列中。
你想的是不能移动的窗口?将FormBorderStyle设置为none。
那么,我仍然不太了解你的用例,但我会采取刺,并提供一个简单的例子。
我假设你想从浮动窗体控制主窗体上的东西。 为此,您需要从浮动窗体中引用主表单。您可以通过创建您的浮动形式的构造函数重载接受你的主窗体的实例,这样做:
public FloatingForm(MainForm mainForm)
{
InitializeComponent();
_mainForm = mainForm;
}
浮动窗体包含一个名为floatingFormTextBox文本框和一个名为Button1按钮。为流动形成部分类看起来是这样的:
public partial class FloatingForm : Form
{
MainForm _mainForm;
public FloatingForm()
{
InitializeComponent();
}
public FloatingForm(MainForm mainForm)
{
InitializeComponent();
_mainForm = mainForm;
}
private void button1_Click(object sender, EventArgs e)
{
_mainForm.DoSomething(floatingFormTextBox.Text);
}
}
主要形式只包含一个名为mainFormTextBox文本框。当主窗体加载时,它创建一个浮动窗体的实例,将自身的引用传递给浮动窗体的新构造函数重载。为主要形式的局部类看起来是这样的:
public partial class MainForm : Form
{
FloatingForm _floatingForm;
public MainForm()
{
InitializeComponent();
}
public void DoSomething(string text)
{
mainFormTextBox.Text = text;
this.Refresh();
}
private void MainForm_Load(object sender, EventArgs e)
{
_floatingForm = new FloatingForm(this);
_floatingForm.Show();
}
}
现在,当我把一些文字到浮动窗体的文本框,然后点击按钮,文本在主窗体的文本框中显示出来。
感谢您的回复。让我补充一些关于用例的细节:对于我来说,这两个表单生活在两个独立的进程中是非常重要的 - 仅仅有两种形式是不够的,并且只有两个消息泵(两次应用程序)是不够的。 Run()在不同的线程中,后台的窗体应该处理所有的事件,前面的浮动窗体(在一个单独的进程中)只是一个叠加层,它不应该处理任何鼠标事件 - 它必须让它通过背景窗体 – Christoph 2009-05-30 21:07:55
覆盖层的目的是什么?隔离度? – 2009-05-30 21:14:45
是的,它不应该可以移动窗口,并且已经将FormBorderStyle设置为none。但是,另外,我希望鼠标点击传播到下面的窗口,我。即我希望窗口不要消耗事件。 – Christoph 2009-05-30 17:16:59