2008-12-13 86 views
7

如何檢測,當我Compact Framework的應用程序正在智能最小化(智能最小化是當用戶在右上角點擊了「X」按鈕時會發生什麼一個Pocket PC)?因爲它在比最小化其他情況下,例如當在主表格的頂部示出了消息框或另一種形式發生的Pocket PC/Windows Mobile的:如何檢測智能最小化

Deactivate事件是不正確的方式。而窗體的WindowState不起作用,因爲.NET CF上沒有「最小化」的WindowState。

聽說通過設置MinimizeBox =假,我的應用程序將被關閉,而不是最小化。但我實際上不希望我的應用程序關閉,我只是想知道它何時已經最小化。

回答

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」或「back」,它使用窗體的close方法。我以各種形式使用它來保持標準。這對於Windows用戶來說不太明確,因爲他們可能會認爲windows mobile中的X與PC中的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); 
    } 
} 
+0

** Compact Framework **不允許訪問正常`Form`的`WindowProc`方法,那麼我該如何使用這個建議呢?或者我在這裏錯過了一些東西...... – 2011-06-22 18:11:48

-1

你是什麼意思,由智能最小化?我想你的意思是你的應用在一段時間內沒有任何活動時會自動最小化?那麼,我不認爲有這樣的事件。

這個blog spot的作者用來打開和關閉內部流程的停用事件。這對於動畫和其他類似的過程是可以接受的,並且消息框或其他表單彈出的情況不存在問題。但是,如果您的進程不能停止,除非應用程序關閉或「智能最小化」,您可以嘗試在停用事件時啓動計時器。如果表單未在特定時間間隔內激活,則停止內部流程將是安全的。

當然,在設計解決方案時,您需要考慮電源管理。看看this,當然還有OpenNetCF的電源通知。

+0

智能最小化是當用戶點擊右上角的「X」按鈕時會發生什麼掌上電腦上的角落。一個相關的問題是如何檢測啓動另一個程序的用戶和屬於我的應用程序的彈出對話框之間的區別(兩者都產生一個Deactivate事件)。 – Qwertie 2008-12-24 17:54:24