| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Разработка Windows Forms > Один экземпляр приложения, с передачей аргументов |
| Автор: farad 17.1.2008, 15:23 | ||
| Поскольку вопрос, «как сделать, чтобы нельзя было запускать более одного экземпляра приложения» возникает с завидной регулярностью, то хочу предложить свое решение данного вопроса. Ваял для себя, но возможно кому-нибудь пригодится еще. Решение позволяет активировать главное окно уже запущенного приложения, при попытке запуска второго экземпляра. При этом происходит передача аргументов командной строки второго экземпляра первому. Например, если приложение поддерживает обработку командной строки, скажем открытие файла определенного типа из проводника, то если при запущенном приложении, щелкнуть по файлу подходящего типа – этот файл будет открыт запущенным экземпляром. Передача аргументов идет через реестр – решил, что это проще всего. Короче, это базовый класс, от которого нужно наследовать главную форму приложения и перегрузить в своей форме метод, который осуществляет обработку аргументов командной строки. Если не требуется обработка аргументов, перегружать ничего не надо. Достаточно просто наследовать главную форму от этого класса, и все.. второй экземпляр вашего приложения уже не запустится…
|
| Автор: Softaz 18.2.2008, 14:07 |
| А если атомы использовать? Все-таки как-то по мне криовато через реестр хранить. |
| Автор: nettitan 6.5.2008, 22:00 |
| Какие еще атомы?, |
| Автор: jonie 6.5.2008, 22:58 | ||
| определяют стандартно через семафоры.. атомы это системные объекты в MSDN примерно там : windowsuserinterface/dataexchange/atoms суть такая : вы пихаете в этот атом строку командную (заметим что атомов может понадобиться несколько, т.к. они ограничены длиной)....потом шлее сообщение окну, где указываете в одном из параметров DWORD атома. и в первом приложении его зачитываете. но мне кажется атомы тут тоже не нужны. 1) вы можете использовать IPC (довольно имхо накладно) 2) а просто передавать используя сообщение WM_COPYDATA не проще ли? на самом деле самая загвоздка передать HWND окна приемника (или вообще какие-то объекты) но и это можно сделать, думаю, через вышеупомянытый семафор... в общем как-то так будет работать вплоне даже..
|
| Автор: source777 6.5.2008, 22:59 |
| ужос. Как можно такие "решения" напоказ выставлять, такое можно только в справочнике "Как не надо делать ни в коем случае" показывать... Итак, решения данной задачи: 1) SendMessage + WM_COPYDATA (самый быстрый способ) 2) GlobalAddAtom + GlobalFindAtom + GlobalDeleteAtom (периодический способ, на который указал Softaz, мне лично навязываемое данным способом активное ожидание не импонирует) 3) Класс Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase (встроенная .NET-поддержка данного алгоритма, хороша тем, что предельно проста в использовании) |
| Автор: mr.DUDA 7.5.2008, 09:12 | ||
Собственно, вот на этом мьютексе всё и можно было сделать, остальной код и не нужен. |
| Автор: nettitan 8.5.2008, 08:40 |
| СПС за инфу, буду пробывать все возможные варианты, дабы найти оптимальный |