Как я понял на Pocket PC, если приложение уже запущено то при повторном запуске exe файла будет просто показана уже запущенная копия.
Но есть одно НО: если ни одна копия не запущена и мы несколько раз нажмем среднюю кнопку на девайсе на запуск выбранного приложения, то запустится несколько копий, так как ни одна не успеет показать свое окно(видим крутящийся сектор) и следовательно не запретит запуск нового приложения
пробовал следуующее:
1. Использование Mutex — очень обрезан для CF, как что отслеживание реализовать нельзя.
2. Вызов API FindWindow — тоже не работает, так как окна не успевают создаться.
Можно реестр, но класса для работы с ним не реализовано в 1.0. Так что разве что API функциями, но для этого нужно тащить в .NET кучу структур!
Может кто сталкивался с этой проблемой или у кого есть идеи?
Здравствуйте, george.forest, Вы писали:
GF>Можно реестр, но класса для работы с ним не реализовано в 1.0. Так что разве что API функциями, но для этого нужно тащить в .NET кучу структур!
GF>Может кто сталкивался с этой проблемой или у кого есть идеи?
On Wed, 26 Apr 2006 13:55:40 +0300, george.forest <53808@users.rsdn.ru>
wrote:
> Не могу никак организовать одну копию приложения! > > Как я понял на Pocket PC, если приложение уже запущено то при повторном > запуске exe файла будет просто показана уже запущенная копия. > Но есть одно НО: если ни одна копия не запущена и мы несколько раз > нажмем среднюю кнопку на девайсе на запуск выбранного приложения, то > запустится несколько копий, так как ни одна не успеет показать свое > окно(видим крутящийся сектор) и следовательно не запретит запуск нового > приложения > > пробовал следуующее: > 1. Использование Mutex — очень обрезан для CF, как что отслеживание > реализовать нельзя. > 2. Вызов API FindWindow — тоже не работает, так как окна не успевают > создаться. > > Можно реестр, но класса для работы с ним не реализовано в 1.0. Так что > разве что API функциями, но для этого нужно тащить в .NET кучу структур! > > Может кто сталкивался с этой проблемой или у кого есть идеи?
Не уверен что отработает на CF — в Win32 я создавал именнованные Kernel
объекты
Возможно такое же можно сделать в CF через System.Runtime.InteropServices;
На крайняк создавай temporary file. Дважды файл создать не удастся. По
закрытию апликухи — удаляй.
Короче копай в сторону междупроцессорного взаимодействия
GF>В CF .NET 1.0 именованый мутекс сздать нельзя, этот конструктор просто не реализован
не библиотечным классом а через интероп.
в CF интероп и Win32 напрямую приходится очень часто юзать, ибо библиотека там урезанная.
через него например клипборд реализуется, евенты с таймаутами, да и много чего.
Здравствуйте, Awaken, Вы писали:
GF>>В CF .NET 1.0 именованый мутекс сздать нельзя, этот конструктор просто не реализован
A>не библиотечным классом а через интероп. A>в CF интероп и Win32 напрямую приходится очень часто юзать, ибо библиотека там урезанная. A>через него например клипборд реализуется, евенты с таймаутами, да и много чего.
Спасибо!
Все получилось!
Вот пример для того кому может тоже понадобится:
enum WinError
{
ERROR_ALREADY_EXISTS = 183
}
[DllImport("coredll.dll")]
public static extern int CreateMutex(IntPtr lpMutexAttributes, bool bInitialOwner, string lpName);
[DllImport("coredll.dll")]
public static extern int GetLastError();
static void Main()
{
// Prevent more then one instance of an application
Win32.CreateMutex(IntPtr.Zero, false, "ONE");
if (Win32.GetLastError() == (int)WinError.ERROR_ALREADY_EXISTS)
return;
// Run
Application.Run(new Form1());
}
Здравствуйте, GForest, Вы писали:
GF>Здравствуйте, Awaken, Вы писали:
GF>>>В CF .NET 1.0 именованый мутекс сздать нельзя, этот конструктор просто не реализован
A>>не библиотечным классом а через интероп. A>>в CF интероп и Win32 напрямую приходится очень часто юзать, ибо библиотека там урезанная. A>>через него например клипборд реализуется, евенты с таймаутами, да и много чего.
GF>Спасибо! GF>Все получилось!
GF>Вот пример для того кому может тоже понадобится:
GF>
GF>enum WinError
GF>{
GF> ERROR_ALREADY_EXISTS = 183
GF>}
GF>[DllImport("coredll.dll")]
GF>public static extern int CreateMutex(IntPtr lpMutexAttributes, bool bInitialOwner, string lpName);
GF>[DllImport("coredll.dll")]
GF>public static extern int GetLastError();
GF>static void Main()
GF>{
GF> // Prevent more then one instance of an application
GF> Win32.CreateMutex(IntPtr.Zero, false, "ONE");
GF> if (Win32.GetLastError() == (int)WinError.ERROR_ALREADY_EXISTS)
GF> return;
GF> // Run
GF> Application.Run(new Form1());
GF>}
GF>