![]() |
|
Модераторы: gambit, Partizan |
![]()
|
|
| farad |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 1.11.2007 Репутация: 3 Всего: 6 |
Поскольку вопрос, «как сделать, чтобы нельзя было запускать более одного экземпляра приложения» возникает с завидной регулярностью, то хочу предложить свое решение данного вопроса. Ваял для себя, но возможно кому-нибудь пригодится еще. Решение позволяет активировать главное окно уже запущенного приложения, при попытке запуска второго экземпляра. При этом происходит передача аргументов командной строки второго экземпляра первому. Например, если приложение поддерживает обработку командной строки, скажем открытие файла определенного типа из проводника, то если при запущенном приложении, щелкнуть по файлу подходящего типа – этот файл будет открыт запущенным экземпляром. Передача аргументов идет через реестр – решил, что это проще всего.
Короче, это базовый класс, от которого нужно наследовать главную форму приложения и перегрузить в своей форме метод, который осуществляет обработку аргументов командной строки. Если не требуется обработка аргументов, перегружать ничего не надо. Достаточно просто наследовать главную форму от этого класса, и все.. второй экземпляр вашего приложения уже не запустится…
Это сообщение отредактировал(а) farad - 28.1.2008, 16:02 |
|||
|
||||
| Softaz |
|
|||
![]() wasm ![]() ![]() Профиль Группа: Участник Сообщений: 373 Регистрация: 16.1.2006 Репутация: 3 Всего: 16 |
А если атомы использовать? Все-таки как-то по мне криовато через реестр хранить.
-------------------- Разочарованный в .NET |
|||
|
||||
| nettitan |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 9.6.2006 Где: г. Хмельницкий Репутация: нет Всего: нет |
Какие еще атомы?,
|
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 5 Всего: 118 |
определяют стандартно через семафоры..
атомы это системные объекты в MSDN примерно там : windowsuserinterface/dataexchange/atoms суть такая : вы пихаете в этот атом строку командную (заметим что атомов может понадобиться несколько, т.к. они ограничены длиной)....потом шлее сообщение окну, где указываете в одном из параметров DWORD атома. и в первом приложении его зачитываете. но мне кажется атомы тут тоже не нужны. 1) вы можете использовать IPC (довольно имхо накладно) 2) а просто передавать используя сообщение WM_COPYDATA не проще ли? на самом деле самая загвоздка передать HWND окна приемника (или вообще какие-то объекты) но и это можно сделать, думаю, через вышеупомянытый семафор... в общем как-то так будет работать вплоне даже..
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: нет Всего: 56 |
ужос. Как можно такие "решения" напоказ выставлять, такое можно только в справочнике "Как не надо делать ни в коем случае" показывать...
Итак, решения данной задачи: 1) SendMessage + WM_COPYDATA (самый быстрый способ) 2) GlobalAddAtom + GlobalFindAtom + GlobalDeleteAtom (периодический способ, на который указал Softaz, мне лично навязываемое данным способом активное ожидание не импонирует) 3) Класс Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase (встроенная .NET-поддержка данного алгоритма, хороша тем, что предельно проста в использовании) Это сообщение отредактировал(а) source777 - 6.5.2008, 23:02 -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 24 Всего: 232 |
Собственно, вот на этом мьютексе всё и можно было сделать, остальной код и не нужен. -------------------- ![]() |
|||
|
||||
| nettitan |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 9.6.2006 Где: г. Хмельницкий Репутация: нет Всего: нет |
СПС за инфу, буду пробывать все возможные варианты, дабы найти оптимальный
|
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Разработка Windows Forms | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |