![]() |
|
||||||||||
|
|||||
|
listener
|
Запрет на запуск второго экземпляра приложения 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();
}
FormTitle и ApplicationTitle можно указать статически в самом компиляторе. Но в этом случае к ним не получишь доступ так просто. И придется писать в условии сравнения титлов сам титл. Не поручусь, что это всегда работает, особенно когда титл русский или необычные символы там есть. Поэтому, лучше назначать их динамически в коде. Последний раз редактировалось alexcon314; 29.11.2007 в 09:20. |
![]() |
Часовой пояс GMT +4, время: 22:14. |
|
|
« Предыдущая тема | Следующая тема » |
|
|