Карманный ПК /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);
}
}
Что именно вы подразумеваете под умным минимизированным? Я полагаю, вы имеете в виду, что ваше приложение автоматически сворачивается в течение некоторого времени без активности? Ну, я не думаю, что есть событие для этого.
Автор этого блога использует событие "Деактивировать" для включения и выключения внутреннего процесса. Это приемлемо для анимации и других подобных процессов, и случаи появления окна сообщения или другой формы не представляют проблем. Однако, если ваш процесс не должен быть остановлен до тех пор, пока приложение не закроется или не будет "минимизировано", вы можете попробовать запустить таймер при отключении событий. Если форма не активируется обратно в течение определенного интервала, тогда было бы безопасно остановить внутренний процесс.
Конечно, при разработке вашего решения вы должны учитывать управление питанием. Взгляните на это и, конечно же, на OpenNetCF для уведомлений о питании.