![]() |
|
#1
|
|||
|
|||
![]() Уважаемые,
пытаюсь сделать: при попытке пользователя запустить второй экземпляр программы, отобразить первый, несмотря на его состояние (свернут, не активен..) получаю:результат успешен, однако после проведенных операций фигурирует баг. баг: после восстановления окна первого экземпляра не работает функция сворачивания окна. При этом закрыть окно и максимизировать его возможно. Код:
h := FindWindow('TfrmMain','%form_title%'); if h <> 0 then begin //если окно не отображено на экране //то максимизировать его if not IsWindowVisible(h) then ShowWindow(h,sw_showmaximized); //выставляем окно на передний план SetForeGroundWindow(h); end else begin Application.Initialize; ... Application.Run; end; |
#2
|
||||
|
||||
![]() Код:
procedure BringToFront(AHandle: HWND); var AThreadId: Cardinal; AProcessId: Cardinal; begin AThreadId:=GetCurrentThreadId; AProcessId:=GetWindowThreadProcessId(GetForegroundWindow, nil); AttachThreadInput(AThreadId, AProcessId, True); ShowWindow(AHandle, SW_RESTORE); SetForegroundWindow(AHandle); AttachThreadInput(AThreadId, AProcessId, False); end; Пишу программы за еду. __________________ |
#3
|
|||
|
|||
![]() Не помогло
![]() |
#4
|
||||
|
||||
![]() это работает? http://zalil.ru/34833170
Пишу программы за еду. __________________ Последний раз редактировалось NumLock, 02.12.2013 в 15:38. |
#5
|
|||
|
|||
![]() А нельзя закинуть на нормальный файлообменник? А то мне не скачать.
|
#6
|
||||
|
||||
![]() Пишу программы за еду. __________________ |
#7
|
|||
|
|||
![]() Программа запускается (DownloaderLite.exe). В ней всё прекрасно работает.
|
#8
|
||||
|
||||
![]() Мое мнение - все дело в параметре sw_showmaximized в ShowWindow. Используй вместо него sw_Restore или т.п. Наверное, система просто показывает окно, не давая себе отчет, что оно развернутое, считая его и дальше свернутым.
|
#9
|
|||
|
|||
![]() По вышеуказанному примеру NumLock'a выполнял SW_RESTORE, однако изменений не заметил.
|
#10
|
||||
|
||||
![]() А так?
Код:
Application.Initialize; h := FindWindow('TForm1','ABCD'); if h <> 0 then begin if not IsWindowVisible(h) then ShowWindow(h,SW_RESTORE); setWindowPos(h, HWND_TOPMOST, 0, 0, 0, 0,SWP_SHOWWINDOW or SWP_NOMOVE or SWP_NOSIZE); end else begin Application.CreateForm(TForm1, Form1); Application.Run; end; Последний раз редактировалось YVitaliy, 02.12.2013 в 16:39. |
#11
|
||||
|
||||
![]() на самом деле все зависит от версии Delphi. либо от VCL или API.
Пишу программы за еду. __________________ |
#12
|
|||
|
|||
![]() У меня вот такой код работает, вроде, стабильно:
Код:
function TMainForm.HookMessageProc(var Message: TMessage): Boolean; begin Result := False; If Message.Msg = WndMessage Then Begin TrayIcon.ShowMainForm; Application.BringToFront; SetForegroundWindow(Self.Handle); Result := True; End; end; TrayIcon - это, на самом деле, TCoolTrayIcon. Собственно, там есть только одна закавыка. Под Vista и 7 надо что бы второй экземпляр отдал разрешение на всплытие окна другого процесса, иначе операционка откажется его активировать. |
#13
|
||||
|
||||
![]() Такой глюк возникает из-за того, что в ShowWindow нужно указывать хэндл не "главной" формы, а главного окна, т.е. Application.
У себя я делал проще - создавал собственное сообщение - примерно так: Код:
const MY_RESTORE = WM_APP + 1; type TfrmMain = class(TForm) ..... private { Private declarations } procedure MyRestore(var Message: TMessage); message MY_RESTORE; ..... implementation ..... procedure TfrmMain.MyRestore(var Message: TMessage); begin Application.Restore; end; тогда в файле проекта будет примерно так: Код:
var h: HWND; begin h := FindWindow('TfrmMain', '%form_title%'); if h <> 0 then begin SendMessage(h, MY_RESTORE, 0, 0); SetForeGroundWindow(h); end else begin Application.Initialize; Application.CreateForm(TfrmMain, frmMain); Application.Run; end; end. |
#14
|
||||
|
||||
![]() Вариантов существует множество, я использую Mutex.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#15
|
||||
|
||||
![]() Присоединяюсь к варианту poli-smen, много раз делал при помощи обработки Message - всё работало прекрасно.
P.S. Рекламу из подписи таки стоит убрать, ибо Цитата:
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 03.12.2013 в 00:07. |