![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вторая копия программы ! [D7, NT4, Win2k, WinXP]
Конопелька © (2005-12-07 00:12:00)Здравтвуйте !
Подскажите пожалуйста исключение варианта запуска второй копии программы !! и что б при повторном запуске программы открывалось уже запущеное мое приложение ! у меня есть несколько примеров но они не совсем меня устраивают ! И подскажите обязательно ли для этого нужно знать название программы !и если его изменить получиться ли исключить запуск второй копии !
И тут же еще один вопрос к этой теме ! есть два приложение - первое простое с двумя кнопками (к примеру ) а второе имеет две формы ! и вот нужно что б по нажатию той или иной кнопки открывалось то или иное окно второй программы (уже запущеной) !
Заранее огромное спасибо за помощь ! ))
Alexander Panov (2005-12-07 13:46:00) [61]Удалено модератором
gdaujk (2005-12-07 13:15:00) [62]Удалено модератором
Alexander Panov (2005-12-07 12:17:00) [63]
> PS: сабж был уже много раз. Можно было и поискать...
Что ж ты сам не поискал правильныйответ?
Например, вот -
http://forum.sources.ru/index.php?showtopic=123826&view=showall
Alexander Panov (2005-12-07 12:10:00) [64]
> gdaujk © (07.12.05 11:33) [8]
Приведенного кода недостаточно для правильного восстановления приложения.
> PS: сабж был уже много раз. Можно было и поискать...
Поэтому высказывание мимо кассы.
gdaujk (2005-12-07 11:33:00) [65]>Alexander Panov © (07.12.05 09:32) [6]
>Думаю, что как раз этот момент и будет самым сложным;)
procedure ForceForegroundWindow(MainWnd: HWND);
var
fPID, cPID: DWORD;
begin
fPID := GetWindowThreadProcessId(GetForegroundWindow, nil);
cPID := GetWindowThreadProcessId(MainWnd, nil);
AttachThreadInput(fPID, cPID, True);
ShowWindow(MainWnd, SW_SHOW);
SetForegroundWindow(MainWnd);
AttachThreadInput(fPID, cPID, False);
end;
PS: сабж был уже много раз. Можно было и поискать...
Eraser (2005-12-07 11:31:00) [66]
> Alexander Panov © (07.12.05 01:07) [4]
Ну эт почему же? :)
2-3 строки + обработка сообщения, imho.
Alexander Panov (2005-12-07 09:32:00) [67]
> При получении показать себя пользователю.
Думаю, что как раз этот момент и будет самым сложным;)
gdaujk (2005-12-07 09:12:00) [68]Eraser © (07.12.05 00:35) [3]
Удобнее для пользователя будет програмное переключение на первый экземпляр:
var
UniqueMes: Integer;
const
UNIQUE_APP_STR = 'MyCoolProject';
...
UniqueMes := RegisterWindowMessage(UNIQUE_APP_STR);
hMutex := CreateMutex(nil, False, UNIQUE_APP_STR);
if GetLastError = ERROR_ALREADY_EXISTS then
begin
PostMessage(HWND_BROADCAST, UniqueMes, 0, 0);
Exit;
end;
...
и после ловить сообщение с Msg = UniqueMes. При получении показать себя пользователю.
Alexander Panov (2005-12-07 01:07:00) [69]
> легко реализуется через пользовательские сообщения.
Совсем даже не легко.
Eraser (2005-12-07 00:35:00) [70]
> Конопелька (07.12.05 00:26) [2]
В dpr файл проекта вставь перед Application.Initialize
CreateMutex(nil, True, 'MyCoolProject');
if GetLastError = ERROR_ALREADY_EXISTS then
begin
MessageBox(0, PChar('Config window already EXISTS!'), SApplicationName, MB_ICONERROR);
Halt;
end;
Конопелька (2005-12-07 00:26:00) [71]обьясни пожалуйста как это сделать через Мьютекс !? я с этим не знаком ! и если можна то малеенький наглядный пример !!) ?
Eraser (2005-12-07 00:21:00) [72]
> Конопелька (07.12.05 00:12)
> Подскажите пожалуйста исключение варианта запуска второй
> копии программы
Создать именованый объект ядра, например мьютекс при старте программы, если объект уже существует, значит копия программы уже запущена.
> у меня есть несколько примеров но они не совсем меня устраивают
чем конкретно?
> обязательно ли для этого нужно знать название программы
не обязательно.
> и вот нужно что б по нажатию той или иной кнопки открывалось
> то или иное окно второй программы (уже запущеной)
легко реализуется через пользовательские сообщения.
см. FindWindow, Send/PostMessage.