-
типичная задача запрета второго запуска приложения
я посмотрел много примеров, взял лучшее и в итоге получил простое элегантное решение
но есть один большой минус во всех этих решениях
почему-то криво получается активировать ранее запущенный экземпляр приложения
допустим приложение MyProgram запущено. Потом я открыл Проводник, перекрыв тем самым форму приложение, и снова пытаюсь запустить MyProgram
По идее в таком случае MyProgram должен вылезть на передний план. Но этого не происходит. Он остаётся сзади проводника, но в панели управление начинает мигать связанная с ней иконка.
Я перепробовал разные подходы, посылал разные сообщения, но сымитировать активацию приложения пользователем - так и не удалось. В конце концов оставил вот такой вариант, потому что результат всёравно один:function NewWndProc(Handle: HWND; Msg: integer; wParam, lParam: longint): longint; stdcall;
begin
if (Msg = MessageID) then
begin
Result := 0;
if IsIconic(Handle) then SendMessage(Handle, WM_SYSCOMMAND, SC_RESTORE, 0)
else SetForegroundWindow(Handle);
end else
begin
Result := CallWindowProc(OldWProc, Handle, Msg, wParam, lParam);
end;
end;
Вопрос. Можно ли как-то человечески активировать старый instance приложения ? -
как вариант, работает вот это
но не слишком ли это жёстко:if IsIconic(Handle) then SendMessage(Handle, WM_SYSCOMMAND, SC_RESTORE, 0)
else
begin
SendMessage(Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
SendMessage(Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
end; -
> DevilDevil © (25.02.13 16:58) [1]
Попробуй функцию вот отсюда, но возможно она уже не заработает как раньше.
http://delphimaster.net/view/4-1130219731
Еще есть SwitchToThisWindow
http://msdn.microsoft.com/ru-RU/library/windows/desktop/ms633553(v=vs.85).aspx
Хотя вроде бы и она работает не так как раньше сейчас. -
> Попробуй функцию вот отсюда, но возможно она уже не заработает
> как раньше.
> http://delphimaster.net/view/4-1130219731
Прекрасно работает, то, что нужно
спасибо! -
тестировано на Windows 7
-
Игорь Шевченко © (25.02.13 18:21) [5]Из всех видов компьютерных преступлений наиболее отвратительным является кража фокуса у активного окна
(с) А. Махоткин -
> Игорь Шевченко © (25.02.13 18:21) [5]
Это не его случай, он же свое окно активирует при запуске другой копии той же программы. Это не кража фокуса не более, чем получение фокуса окном программы при запуске оной. -
Игорь Шевченко © (25.02.13 18:29) [7]DVM © (25.02.13 18:24) [6]
Это к твоей функции относится -
ALS (25.02.13 19:13) [8]AllowSetForegroundWindow(ASFW_ANY);
-
robt (25.02.13 21:00) [9]
> Он остаётся сзади проводника, но в панели управление начинает
> мигать связанная с ней иконка
этот вариант поведения - настройка в самой винде -
Eraser © (02.03.13 10:20) [10]
> DevilDevil © (25.02.13 16:53)
достаточно SetForegroundWindow, правда это не совсем активация, а просто вывод на передний план, но может оно и к лучшему.
зачем у тебя этот код выполняется в оконной процедуре не понятно.
> if IsIconic(Handle) then SendMessage(Handle, WM_SYSCOMMAND,
> SC_RESTORE, 0)
> else SetForegroundWindow(Handle);
нужно сначала восстановить, а затем вызвать SetForegroundWindow.
Вообще, из уже активного приложения, как в твоем случае, можно активировать любые окна даже без финтов ушами.