|
|
|||||
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, время: 12:58. |
|
« Предыдущая тема | Следующая тема » |
|
|