2008-12-13 20 views
7

Jak wykryć, kiedy moja aplikacja Compact Framework jest zminimalizowana (inteligentne minimalizowanie jest tym, co dzieje się, gdy użytkownik kliknie przycisk "X" w prawym górnym rogu na Pocket PC)?Pocket PC/Windows Mobile: jak wykrywać inteligentne minimalizowanie

Zdarzenie Dezaktywuj nie jest właściwą metodą, ponieważ występuje w okolicznościach innych niż minimalizacja, na przykład w przypadku wyświetlenia okna komunikatu lub innej formy nad głównym formularzem. A WindowState formularza nie pomaga, ponieważ nie ma "zminimalizowanego" WindowState na .NET CF.

Słyszałem, że ustawiając MinimizeBox = false, moja aplikacja zostanie zamknięta zamiast zminimalizowana. Ale tak naprawdę nie chcę, aby moja aplikacja się zamknęła, chcę tylko wiedzieć, kiedy została ona zminimalizowana.

Odpowiedz

5

Myślę, że sposobem na przejście tutaj jest przetwarzanie komunikatu WM_ACTIVE, a następnie sprawdzenie, czy parametr fMinimized nie jest równy zero. Więcej informacji na temat deklarowania tego komunikatu w kodzie można znaleźć pod numerem here.

Postaram się dowiedzieć, jak dokładnie zakodować to w C# i udowodnić hipotezę. Jednak może jesteś szybszy ode mnie i zrozumiesz.

Sprawdź również funkcje DefWindowProc i WindowProc, które są używane do przetwarzania wiadomości. Funkcje są deklarowane w kodzie jak poniżej:

najpierw include:

using System.Runtime.InteropServices; 

następnie w klasie deklarują się ten

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

istnieje inna rzeczą, jaką można zrobić, jest to bardziej "filozoficzne" rozwiązanie. INMO smart minimize X jest mylące dla użytkowników, dlatego nie lubię tego włączać. Zamiast tego podaję przycisk w prawym dolnym rogu formularza, który mówi "zamknij" lub "powrót", który używa metody zamknięcia formularza. Użyłem go we wszystkich formach, aby zachować standard. Jest to mniej niejednoznaczne dla użytkowników systemu Windows, ponieważ mogą zakładać, że X w systemie Windows Mobile jest taki sam X w systemie Windows na PC.

Jeśli z jakiegoś powodu trzeba zminimalizować aplikację lub wysłać go do tła użyć następującego kodu:

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 ** nie daje dostępu do metody 'WindowProc' dla normalnych' Form's, więc jak mogę skorzystać z tej porady? Czy może czegoś tutaj brakuje ... –

-1

Co dokładnie rozumiesz przez zmaksymalizowaną inteligencję? Przypuszczam, że masz na myśli, że Twoja aplikacja jest automatycznie minimalizowana bez żadnej aktywności przez jakiś czas? Cóż, nie sądzę, żeby to było jakieś wydarzenie.

Autor tego blog spot używa zdarzenia Deactivate do włączania i wyłączania procesu wewnętrznego. Jest to dopuszczalne w przypadku animacji i innych podobnych procesów, a przypadki skrzynki komunikatów lub innych formularzy pojawiają się bez problemów. Jeśli jednak proces nie może zostać zatrzymany, dopóki aplikacja nie zamknie się lub nie zostanie "inteligentnie zminimalizowany", można spróbować uruchomić zegar po dezaktywacji zdarzeń. Jeśli formularz nie zostanie aktywowany z powrotem na określony czas, bezpieczne zatrzymanie procesu wewnętrznego.

Oczywiście przy projektowaniu rozwiązania należy wziąć pod uwagę Zarządzanie zasilaniem. Spójrz na this i oczywiście również OpenNetCF dla powiadomień o zasilaniu.

+0

Inteligentne zminimalizować, co się dzieje, gdy użytkownik kliknie przycisk „X” w prawym górnym rogu narożnik na Pocket PC.Powiązanym problemem jest to, jak wykryć różnicę między użytkownikiem uruchamiającym inny program a pojawieniem się okna dialogowego, które należy do mojej aplikacji (oba generują zdarzenie Deactivate). – Qwertie