7

Compact Frameworkアプリケーションがスマート最小化されていることを検出するにはどうすればよいですか(スマート最小化とは、ユーザーがPocket PCの右上隅にある[X]ボタンをクリックしたときに発生することです)。

非アクティブ化イベントは、メッセージボックスまたは別のフォームがメインフォームの上に表示される場合など、最小化以外の状況で発生するため、正しい方法ではありません。また、.NET CFには「最小化された」WindowStateがないため、フォームのWindowStateは役に立ちません。

MinimizeBox = falseに設定すると、アプリが最小化されずに閉じられると聞きました。しかし、実際にはアプリを閉じたくありません。アプリが最小化されたのはいつかを知りたいだけです。

4

2 に答える 2

5

ここに行く方法は、WM_ACTIVEメッセージを処理してから、fMinimizedパラメーターがゼロでないかどうかを確認することだと思います。このメッセージをコードで宣言する方法の詳細については、こちらをご覧ください。

これをC#で正確にコーディングする方法を理解し、仮説を証明してみます。しかし、あなたはおそらく私よりも速く、それを理解します。

また、メッセージの処理に使用される関数DefWindowProcおよびWindowProcも確認してください。関数は、次のようにコードで宣言されます。

最初に含めるものがあります:

using System.Runtime.InteropServices;

次に、クラスでこのように宣言します

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

あなたができる別のことがあります、これはより「哲学的な」回避策です。INMOスマートミニマムXはユーザーを混乱させるので、それを含めたくありません。代わりに、フォームの右下隅に「閉じる」または「戻る」というボタンを用意します。これは、フォームの閉じる方法を使用します。標準を維持するために、あらゆる形式で使用しました。これは、Windows MobileのXがPCのWindowsのXと同じであると想定する可能性があるため、Windowsユーザーにとってはそれほど曖昧ではありません。

何らかの理由でアプリを最小化するか、バックグラウンドに送信する必要がある場合は、次のコードを使用してください。

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);
    }
} 
于 2009-01-04T01:13:16.737 に答える
-1

スマート最小化とは正確にはどういう意味ですか? しばらくアクティビティがない場合、アプリが自動的に最小化されることを意味していると思いますか? まあ、そんなイベントはないと思います。

このブログ スポットの作成者は、内部プロセスのオンとオフを切り替えるために Deactivate イベントを使用します。これは、アニメーションやその他の同様のプロセスでは許容され、メッセージ ボックスや別のフォームがポップアップする場合は問題ありません。ただし、アプリケーションを閉じるか「スマート最小化」しない限りプロセスを停止してはならない場合は、非アクティブ化イベントでタイマーを開始してみてください。フォームが特定の間隔でアクティブ化されない場合は、内部プロセスを安全に停止できます。

もちろん、ソリューションを設計する際には、電源管理を考慮する必要があります。これを見て、もちろん電源通知用の OpenNetCF も見てください。

于 2008-12-15T07:29:06.007 に答える