WinForms是否有类似于WPF的Application.Activate的事件?

时间:2011-02-01 15:20:52

标签: .net winforms

我需要一种方法在我的应用程序激活时通知(通过Alt-Tab任务切换,单击任务栏上的图标等),以显示重新加载“文件”对话框。

我尝试MainForm.Activated但每当我关闭应用程序模式对话框时都会调用此事件。

理想情况下,我想要的是类似于WPF中的Application.Activated事件,但我可以从WinForms应用程序中使用。

2 个答案:

答案 0 :(得分:4)

ActivatedDeactivate事件似乎对我有用。当您标签离开时,会调用Deactivate。当您同时选中表单时,会调用Activated

   public partial class Form1 : Form
   {
      public Form1()
      {
         InitializeComponent();
         this.Activated += new EventHandler(Form1_Activated);
         this.Deactivate += new EventHandler(Form1_Deactivate);
      }

      void Form1_Deactivate(object sender, EventArgs e)
      {
         System.Diagnostics.Trace.WriteLine("DeActivated");
      }

      void Form1_Activated(object sender, EventArgs e)
      {
         System.Diagnostics.Trace.WriteLine("Activated");
      }
   },

刚刚找到here

的解决方案
protected void OnActivateApp(bool activate) {
  Console.WriteLine("Activate {0}", activate);
}
protected override void WndProc(ref Message m) {
  // Trap WM_ACTIVATEAPP
  if (m.Msg == 0x1c) OnActivateApp(m.WParam != IntPtr.Zero);
  base.WndProc(ref m);
}

然后在OnActivateApp内部,如果激活了应用程序,则激活为true,如果已激活,则激活为false。

答案 1 :(得分:1)

通常的行为(即Visual Studio和许多其他编辑器)仅在您激活应用程序时检查在编辑器外部修改的文件(在没有焦点后获得焦点),如您所述。

我认为问题并不是你所暗示的过于频繁地调用Activated事件,而是你检测程序外部修改的文件的方法不正确。我认为你需要像这样实现你的逻辑:

  • 首次将文件读入您​​的程序
  • 将文件内容保留在磁盘上,因为它们位于缓冲区中(让我们称之为缓冲区1)
  • 允许您的用户编辑内存中的文件,来自不同的缓冲区(让我们称之为缓冲区2)
  • 激活应用程序时(OnActivate事件处理程序),从磁盘读取文件并将文件内容与缓冲区1进行比较
  • 如果磁盘中的文件与缓冲区1不同,则提示用户加载更改的文件,覆盖其更改
  • 当用户将文件从缓冲区2保存到磁盘时,将缓冲区1的内容替换为缓冲区2的内容
  • 可选:在从应用程序将文件保存到磁盘之前,将缓冲区2与缓冲区1进行比较,以确保最后一次在程序外修改文件。

通过这种方式,您可以经常检查文件修改,而不会中断用户,除非文件确实在您的程序之外进行了更改。