我目前正在研究一个包含多个项目的大型解决方案。
在我使用的许多表格上form.ShowDialog();
或from.Show();
(表格名称而不是表格)
我使用长矛线制作了一个加载屏幕。
所以我需要重载每一个form.Show()
并form.ShowDialog()
实现这个新功能。
我在谷歌上搜索了几个小时,但我找不到任何有用的东西。我自己也试过不同的东西。但无法弄清楚这一点。
有没有办法重载每个表格 Show()
和ShowDialog()
解决方案?
我目前正在研究一个包含多个项目的大型解决方案。
在我使用的许多表格上form.ShowDialog();
或from.Show();
(表格名称而不是表格)
我使用长矛线制作了一个加载屏幕。
所以我需要重载每一个form.Show()
并form.ShowDialog()
实现这个新功能。
我在谷歌上搜索了几个小时,但我找不到任何有用的东西。我自己也试过不同的东西。但无法弄清楚这一点。
有没有办法重载每个表格 Show()
和ShowDialog()
解决方案?
我认为这是最适合您的解决方案。我了解您的项目中有许多不方便重新组织的表单(例如让它们从同一个表单类继承并覆盖Show
该类ShowDialog
)。此解决方案要求您在显示该表单之前只能访问Handle
您想要执行的表单hook
或insert
代码:
public class FormWndProc : NativeWindow {
protected override void WndProc(ref Message m){
if(m.Msg == 0x18&&m.WParam != IntPtr.Zero)//WM_SHOWWINDOW = 0x18
{
//your code here
//you can use m.HWnd to get the Handle of the form
}
base.WndProc(ref m);
}
}
//use the class
//suppose you want to execute the code before showing the form1, form2, form3
new FormWndProc().AssignHandle(form1.Handle);
new FormWndProc().AssignHandle(form2.Handle);
new FormWndProc().AssignHandle(form3.Handle);
//you can save the instance of FormWndProc to call the ReleaseHandle() method later if you don't want to insert code before showing the form.
如果您可以访问您的表单,我的意思是您可以直接覆盖方法WndProc
,您可以执行以下操作:
public class Form1 : Form {
///....
protected override void WndProc(ref Message m){
if(m.Msg == 0x18&&m.WParam != IntPtr.Zero)//WM_SHOWWINDOW = 0x18
{
//your code here
//you can use m.HWnd to get the Handle of the form
}
base.WndProc(ref m);
}
}
//This way you don't need the class FormWndProc as defined above.
让解决方案中的每个表单都从您编写的自定义类继承,然后从 Form 继承。如果您在此“中间”类中覆盖 .Show 和 .ShowDialog ,它将应用于所有子类的表单。这仍然需要您接触解决方案中的每个表单文件,但这是在许多表单中实现通用代码的正确方法。
将此添加到您的 cs 文件的顶部
using ext;
namespace ext
{
public static class extensions
{
public static DialogResult ShowDialog(this Form form, string title)
{
DialogResult ret;
form.Text = title;
ret = form.ShowDialog();
return ret;
}
}
}
这将重载所有表单 ShowDialog() 函数以在显示对话框时接收并设置表单标题。
private void form(object sender, EventArgs e)
{
this.ShowDialog("My new title");
}
一种可能的解决方案是让您的表单派生自一个覆盖 and 的默认功能的自定义基Show()
类ShowDialog()
。这意味着您需要找到用于这两种方法中的任何一种的任何形式并实现此功能。例如
创建一个实现表单的自定义类:
public class CustomForm : Form
{
public DialogResult ShowDialog()
{
throw new NotImplementedException();
}
}
从该形式派生,例如
public partial class Form2 : CustomForm
{
}
叫它,
form2.ShowDialog();
使用一些深奥的 Win32 调用,可能会挂钩这些方法。但是,您将在 .NET 领域之外很好地做到这一点,并且解决方案将比它的价值更复杂。我推荐以下两件事之一:
Form
. 新基类将包含Show
和ShowDialog
方法的新声明(使用new
关键字隐藏底层Form
成员)。将您的新逻辑添加到其中并在适当时调用原始Form.Show
/ 。Form.ShowDialog
让您的应用程序中的每个表单都派生自您的新基类。