|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
"Запрет повторного запуска" vs. AlphaSkins
Долгое время программа работала спокойно, без каких-либо проблем. Если её копия уже была запущена, то она успешно передавала ей управление и "умирала". Переписал программу с использованием АльфаСкинов, и тут начался каламбур - программа точно так же поднимает окно, если оно за чем-то спрятано, но вот в случае, если окно свёрнуто - развернуть его, как было раньше, не получается.
Использую вот такой фрагмент: Код:
var PreviousInstanceWindow : LongWord; begin PreviousInstanceWindow := FindWindow('TfMain',nil); if PreviousInstanceWindow <> 0 then begin if IsIconic(PreviousInstanceWindow) then ShowWindow(PreviousInstanceWindow,SW_RESTORE) else SetForegroundWindow(PreviousInstanceWindow); Halt; end; Application.Initialize; Application.CreateForm(TfMain, fMain); Application.Run; end; P.S. Вариант "не использовать скины" не рассматривается. Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#2
|
||||
|
||||
Попробуй вот такое решение:
Код:
var Form1: TForm1; PreviousInstanceWindow: THandle; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin if WaitForSingleObject(PreviousInstanceWindow, 0) <> 0 then begin ShowWindow(PreviousInstanceWindow, SW_RESTORE); Application.Terminate; end else SetForegroundWindow(PreviousInstanceWindow); end; initialization PreviousInstanceWindow := CreateMutex(nil, True, 'DJ PhoeniX'); finalization CloseHandle(PreviousInstanceWindow); end. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
||||
|
||||
Не будет оно работать...
Да и проблемы не решит. Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 17.01.2011 в 13:06. |
#4
|
||||
|
||||
Аргументируй
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#5
|
||||
|
||||
1. Хендл мьютекса и хендл окна в данном случае - одно и то же? Что будет, если "восстановить окно" Мьютекса?
2. Проверка работает нормально, меня интересует, почему перестало восстанавливаться из трея окно после добавления альфы. Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#6
|
||||
|
||||
файл проекта:
Код:
program Project1; uses Windows, Messages, Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} var PreviousInstanceWindow : LongWord; begin PreviousInstanceWindow := FindWindow('TfMain',nil); if PreviousInstanceWindow <> 0 then begin // if IsIconic(PreviousInstanceWindow) then SendMessage(PreviousInstanceWindow, WM_USER, 0, 0); // else // SetForegroundWindow(PreviousInstanceWindow); Halt; end; Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. главная форма: Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private declarations } procedure WMUSER(var Message: TMessage); message WM_USER; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function SetForegroundWindow(AHandle: THandle): Boolean; var AWindow: THandle; AThreadId: Cardinal; AProcessId: Cardinal; begin AWindow:=GetForegroundWindow; AThreadId:=GetCurrentThreadId; AProcessId:=GetWindowThreadProcessId(AWindow, nil); AttachThreadInput(AThreadId, AProcessId, True); Result:=Windows.SetForegroundWindow(AHandle); AttachThreadInput(AThreadId, AProcessId, False); end; { TForm1 } procedure TForm1.WMUSER(var Message: TMessage); begin if not Visible then Show; ShowWindow(Application.Handle, SW_SHOW); Application.Restore; Application.BringToFront; // SetForegroundWindow(Handle); end; end. только WM_USER+что-то, имхо Пишу программы за еду. __________________ |
#7
|
||||
|
||||
Работает, спасибо. Хотя, теперь окно не появляется, если чем-то перекрыто, но моргает кнопка в таскбаре - но так даже лучше.
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#8
|
||||
|
||||
а если // SetForegroundWindow(Handle); раскомментировать?
Пишу программы за еду. __________________ |
#9
|
||||
|
||||
Пробовал, ничего не меняет. Да и ладно, и так хорошо.
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |