Карманный ПК / Windows Mobile: как обнаружить смарт-минимизацию

Как определить, когда приложение Compact Framework минимизируется интеллектуальным способом (интеллектуальное минимизация - это то, что происходит, когда пользователь нажимает кнопку «X» в верхнем правом углу на Pocket PC)?

Событие Деактивировать не является правильным способом, потому что оно происходит в обстоятельствах, отличных от минимизации, например, когда окно сообщения или другая форма отображается поверх главной формы. И WindowState формы не помогает, потому что в .NET CF нет «свернутого» WindowState.

Я слышал, что установив MinimizeBox = false, мое приложение будет закрыто, а не свернуто. Но на самом деле я не хочу, чтобы мое приложение закрывалось, я просто хочу знать, когда оно было свернуто.

2 ОТВЕТА
РЕШЕНИЕ

Я думаю, что путь здесь - это обработать сообщение 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, потому что они могут предположить, что X в Windows Mobile - это то же самое 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);
    }
} 
5
4.02.2014 06:59:30
Compact Framework не дает доступ к WindowProcспособу нормальным Formс, так как я могу использовать этот совет? Или я что-то здесь упускаю ...
Jeremy Frank 22.06.2011 18:11:48

Что именно вы подразумеваете под умным минимизированным? Я полагаю, вы имеете в виду, что ваше приложение автоматически сворачивается в течение некоторого времени без активности? Ну, я не думаю, что для этого есть событие.

Автор этого блога использует событие «Деактивировать» для включения и выключения внутреннего процесса. Это приемлемо для анимации и других подобных процессов, и случаи появления окна сообщения или другой формы не представляют проблем. Однако, если ваш процесс не должен быть остановлен, пока приложение не закроется или не будет «минимизировано», вы можете попробовать запустить таймер при деактивации событий. Если форма не активируется обратно в течение определенного интервала, тогда было бы безопасно остановить внутренний процесс.

Конечно, при разработке вашего решения вам необходимо учитывать управление питанием. Взгляните на это и, конечно же, на OpenNetCF для уведомлений о питании.

-1
5.01.2009 06:24:08
Умное свертывание - это то, что происходит, когда пользователь нажимает кнопку «X» в верхнем правом углу на Pocket PC. Связанная проблема заключается в том, как определить разницу между пользователем, запускающим другую программу, и всплывающим диалоговым окном, которое принадлежит моему приложению (оба вызывают событие Deactivate).
Qwertie 24.12.2008 17:54:24