Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > Flash Приложения: AIR, Zinc и тд.

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 27.11.2007, 23:40
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 15  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Запрет на запуск второго экземпляра приложения 1

Код:
//заставляем окно приложения реагировать 
// на системные сообщения
mdm.Application.doEvents();
mdm.Application.enableExitHandler();
mdm.Application.onAppExit = exit;
mdm.Forms.MainForm.title = "form";
hwnd = mdm.System.Registry.load("AppHwnd");
if (hwnd && hwnd != "none") {
	// шлем WM_SYSCOMMAND с wParam = SC_RESTORE и lParam = 1
	mdm.System.sendMessage(hwnd, 0x0112, 0xF120, 1);
	// ставим фокус
	mdm.System.setWindowFocus(hwnd);
	flag = false;
	exit();
} else {
	var wList = mdm.System.getWindowList();
	var i = 0;
	while (wList[i][0] != "form") {
		i++;
	}
	mdm.System.Registry.save("AppHwnd", wList[i][1]);
	flag = true;
}
function exit() {
	if (flag) {
		mdm.System.Registry.save("AppHwnd", "none");
	}
	mdm.Application.exit();
}
При запуске пример пишет в реестр хэндл своего окна. Второй экземляр при запуске читает из реестра этот хэндл и шлет мессаги на ресторе и сетфокус первому экземпляру, а сам отваливает. Первый экземпляр при закрытии вытирает из реестра хэндл.
Конечно, сохранять хэндл необязательно в реестр, просто это в данной ситуации удобно.
В случае нештатного завершения работы приложения эта схема не работает.
ПОЭТОМУ ДРУГОЙ ПРИМЕР.

Запрет на запуск второго экземпляра приложения 2

Код:
mdm.Application.doEvents();
formTitle = mdm.Forms.MainForm.title = "form";
appTitle = mdm.Application.title = "app";
var wList = mdm.System.getWindowList();
var appList:Array = new Array();
var i = 0;
while (wList[i][1]) {
	if (wList[i][0] == formTitle || wList[i][0] == appTitle) {
		appList.push(wList[i][1]);
	}
	i++;
}
hwnd = appList[1];
if (hwnd) {
	mdm.System.sendMessage(hwnd, 0x0112, 0xF120, 1);
	mdm.System.setWindowFocus(hwnd);
	mdm.Application.exit();
}
Здесь все основано на том факте, что в списке окон wList окно второго экземпляра приложения находится выше чем окно ранее запущенного экземпляра. и при добавлении в массив appList хэндл уже запущенного окна (если таковое присутствует) оказывается под номером 1, а хэндл второго под номером 0, если запускать их подряд. В случае запуска не подряд можно применить сортировку массива appList. Действительно, должен признать, что в этом случае нужно проверять наличие в списке wList и титла на кнопке приложения в таскбаре: когда оно свернуто принудительно только так его можно найти. Поэтому присутствует строчка mdm.Application.title="...", где устанавливается титл на этой кнопке.
FormTitle и ApplicationTitle можно указать статически в самом компиляторе. Но в этом случае к ним не получишь доступ так просто. И придется писать в условии сравнения титлов сам титл. Не поручусь, что это всегда работает, особенно когда титл русский или необычные символы там есть. Поэтому, лучше назначать их динамически в коде.


Последний раз редактировалось alexcon314; 29.11.2007 в 09:20.
Создать новую тему   Часовой пояс GMT +4, время: 23:22.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 23:22.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.