Текущий архив: 2004.10.24;
Скачать: CL | DM;
ВнизЗапуск одной копии приложения Найти похожие ветки
← →
vvip (2004-10-07 05:16) [0]Для ограничения запуска только одной копии приложения использую приведенный ниже код. Все работает прекрасно - за исключением малости. Окно запущенного приложения находится и активируется, но после этого перестает работать кнопка "минимизировать". Нажимается, но никакой реакции не происходит. Кто-нибудь может подсказать почему и как исправить?
const
MemFileSize = 1024;
MemFileName = "one_inst_sup_memfile";
var
MemHnd : HWND;
Handle1: Longint;
Handle2: Longint;
begin
{ Попытаемся создать файл в памяти }
MemHnd := CreateFileMapping(HWND($FFFFFFFF),
nil,
PAGE_READWRITE,
0,
MemFileSize,
MemFileName);
{ Если файл не существовал запускаем приложение }
if GetLastError<>ERROR_ALREADY_EXISTS then begin
Application.Initialize;
Application.Title := "Проект";
Application.CreateForm(TDM, DM);
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end else begin
Handle1 := FindWindow("TApplication","Проект");
if Handle1<>0 then begin
Handle2 := FindWindow("TAppBuilder",nil);
if Handle2=0 then begin
Handle2 := FindWindow("TfrmMain","Проект");
ShowWindow(Handle2, SW_RESTORE);
end;
SetForegroundWindow(Handle1); end;
end;
CloseHandle(MemHnd);
end.
← →
Fedia © (2004-10-07 06:28) [1]Для ограничения запуска только одной копии приложения обычно использую:
CreateSemaphore(nil,0,1,pchar("ListCX"));
if GetLastError = ERROR_ALREADY_EXISTS then Halt(1);
где "ListCX" - константа, используемая только в одном приложении (обычно название программы).
Этот код вставляется на OnCreate главной формы.
← →
vvip (2004-10-07 06:36) [2]Fedia
Вопрос не в том, как обнаружить, что копия одна - приведенный метод с созданием файла в памяти работает замечательно. Вопрос в том, почему после активации найденного окна в нем перестает работать кнопка "минимизировать"
← →
Fedia © (2004-10-07 06:53) [3]Ваш вопрос понятен. За неимением ответа, и времени на разбор примера, решил предложить другой, рабочий вариант, не приводящий к последующим неудобствам в работе :)
← →
Nalexey © (2004-10-07 08:37) [4]Попробуй вот так:
if IsIconic(Handle2) then
ShowWindow(Handle2, SW_RESTORE)
Только опять не совсем понятно, ты ищешь зачемто IDE...
← →
Skyle © (2004-10-07 08:41) [5]Может использовать вместо ShowWindow функцию SetForegroundWindow.
Я с ней вроде как проблем не встречал.
← →
vvip (2004-10-07 08:55) [6]Nalexey
Спасибо за совет - попробую.
IDE я ищу затем, что часто запускаю программу из под IDE пока отлаживаю и форма окна у меня там открытая. Запущенный скомпиленный экзешник находит ту свою форму что в IDE в дизайнере, и активирует ее, вместо предыдущей копии exe-шника. Чтоб такого не случалось - определяю запущен ли IDE и если да - форму не показываю.
← →
vvip (2004-10-07 08:57) [7]Skyle
Если сказать SetForegroundWindow для окна, которое минимизировано, оно не раскрывается. Так и остается минимизированным, хотя и Foreground
← →
Jay (2004-10-07 09:19) [8]Можно ещё так
Uses
SyncObjs;
var
check_event: TEvent;
check_event := TEvent.Create(nil, false, true, "MYPROGRAM_CHECKEXIST");
if check_event.WaitFor(10) = wrSignaled then
begin
//если одна, то...
end
← →
vvip (2004-10-07 09:19) [9]Кстати, вот еще проблема с SetForegroundWindow - если в контексте рассматриваемого примера говорить SetForegroundWindow не для найденного окна приложения, а для главного окна программы (TfrmMain) и при этом главное окно породило модальный диалог или форму (например ввод регистрации пользователя или вывесило какое-либо сообщение) - форма поднимается наверх, а модальное окно, на который переключен весь ввод клавиатуры/мыши остается позади окна. Пользователь его естественно не видит и создается впечатление, что программа повисла, поскольку не реаегирует ни на клаву, ни на мышь. Скажешь Alt-Tab туда сюда - только тогда модальное окно вылезет как и положено поверх формы его породившей. Как с этим бороться?
← →
vvip (2004-10-07 09:23) [10]Jay,
Ok, переформулируем вопрос по-другому:
Кто-нибудь может подсказать почему после выполнения нижеприведенного кусочка кода Окно приложения перестает реагировать на кнопку "Минимизировать"? Кнопка нажимается, но никакого эффекта сворачивания не происходит.
Handle1 := FindWindow("TApplication","Проект");
if Handle1<>0 then begin
Handle2 := FindWindow("TAppBuilder",nil);
if Handle2=0 then begin
Handle2 := FindWindow("TfrmMain","Проект");
ShowWindow(Handle2, SW_RESTORE);
end;
SetForegroundWindow(Handle1);
end;
← →
Jay (2004-10-07 09:31) [11]А если не SW_RESTORE, a SW_SHOW?
← →
vvip (2004-10-07 09:52) [12]Jay
Если SW_SHOW, то минимизированное окно так и останется минимизированным
← →
Jay (2004-10-07 10:29) [13]Если я правильно понял вопрос, то можно Главному окну делать Hide, а потом Show (ShowModal) вместо сворачивания !?
← →
Jay (2004-10-07 10:30) [14]Если я правильно понял вопрос, то можно Главному окну делать Hide, а потом Show (ShowModal) вместо сворачивания !?
Страницы: 1 вся ветка
Текущий архив: 2004.10.24;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.034 c