Конференция "WinAPI" » Активация приложения
 
  • DevilDevil © (25.02.13 16:53) [0]
    типичная задача запрета второго запуска приложения
    я посмотрел много примеров, взял лучшее и в итоге получил простое элегантное решение

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

    допустим приложение 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 приложения ?
  • DevilDevil © (25.02.13 16:58) [1]
    как вариант, работает вот это
    но не слишком ли это жёстко:
       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;

  • DVM © (25.02.13 17:41) [2]

    > 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

    Хотя вроде бы и она работает не так как раньше сейчас.
  • DevilDevil © (25.02.13 18:06) [3]
    > Попробуй функцию вот отсюда, но возможно она уже не заработает
    > как раньше.
    > http://delphimaster.net/view/4-1130219731


    Прекрасно работает, то, что нужно
    спасибо!
  • DevilDevil © (25.02.13 18:06) [4]
    тестировано на Windows 7
  • Игорь Шевченко © (25.02.13 18:21) [5]
    Из всех видов компьютерных преступлений наиболее отвратительным является кража фокуса у активного окна
    (с) А. Махоткин
  • DVM © (25.02.13 18:24) [6]

    > Игорь Шевченко ©   (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.

    Вообще, из уже активного приложения, как в твоем случае, можно активировать любые окна даже без финтов ушами.
 
Конференция "WinAPI" » Активация приложения
Есть новые Нет новых   [134430   +4][b:0][p:0.001]