掌上电脑/ Windows Mobile:如何检测智能最小化

时间:2008-12-13 21:35:28

标签: .net windows-mobile compact-framework pocketpc minimize

如何检测Compact Framework应用程序何时智能化最小化(智能最小化是用户单击Pocket PC右上角的“X”按钮时发生的情况)?

Deactivate事件不是正确的方法,因为它发生在最小化以外的情况下,例如在主窗体顶部显示消息框或其他窗体时。窗体的WindowState没有帮助,因为.NET CF上没有“最小化”的WindowState。

我听说通过设置MinimizeBox = false,我的应用程序将关闭而不是最小化。但我实际上不希望我的应用程序关闭,我只是想知道它何时被最小化。

2 个答案:

答案 0 :(得分:5)

我认为这里的方法是处理WM_ACTIVE消息,然后检查fMinimized参数是否不为零。您可以在here中的代码中找到有关如何声明此消息的详细信息。

我将尝试弄清楚如何在C#中对此进行精确编码并证明该假设。但是你可能比我快,并想出来。

同时检查用于处理消息的函数DefWindowProcWindowProc。函数在代码中声明如下:

首先要包括:

using System.Runtime.InteropServices;

然后在类中声明像这样

[DllImport("coredll.dll")]
static extern IntPtr DefWindowProc(IntPtr hWnd, uint uMsg, UIntPtr wParam,
   IntPtr lParam);

你还可以做另外一件事,这更像是一种“哲学”的解决方法。 INMO智能最小化X让用户感到困惑,这就是我不喜欢包含它的原因。相反,我在表单的右下角提供了一个按钮,表示“关闭”或“返回”,它使用表单的close方法。我以各种形式使用它来保持标准。这对于Windows用户来说不那么模糊,因为他们可能会认为Windows Mobile中的X与PC的Windows中的X相同。

如果由于某种原因您需要最小化您的应用或将其发送到后台,请使用以下代码:

using System.Runtime.InteropServices;
...

public partial class Main : Form
{
   public Main()
    {


        InitializeComponent();
    }

  [DllImport("coredll.dll")]
    static extern int ShowWindow(IntPtr hWnd, int nCmdShow);

  const int SW_MINIMIZED = 6;

  ...
  ...

   public void HideForm()
    {
        ShowWindow(this.Handle, SW_MINIMIZED);
    }
} 

答案 1 :(得分:-1)

智能最小化到底是什么意思?我想你的意思是你的应用程序在一段时间内没有活动时自动被最小化了?好吧,我不认为有这样的事件。

blog spot的作者使用Deactivate事件打开和关闭内部进程。这对于动画和其他类似的过程是可以接受的,并且弹出消息框或其他形式的情况也没有问题。但是,如果除非应用程序关闭或“智能最小化”,否则不得停止您的进程,您可以尝试在停用事件时启动计时器。如果表单在特定时间间隔内未被激活,则停止内部过程将是安全的。

当然,在设计解决方案时,您需要考虑电源管理。看看this,当然还有OpenNetCF用于电源通知。