|
Запуск одного экземпляра программы WPF
|
|||
---|---|---|---|
#18+
Добрый день Возникла необходимость сделать так чтобы при повторном запуске программы происходило переключение на уже открытый экземпляр. И если он был свёрнут то развернулся обратно. Погуглив немного нашел пару решений, но они все всего лишь выполняют эту задачу на половину, т.е. просто не запускают 2-й экземпляр и ничего не делают при этом либо показывают сообщение об ошибке.Встречались варианты на определение уже запущенного экземпляра в 200 строк кода... А пользователи же не хотят видеть никаких ошибок - поэтому нужно переключить на уже запущенный экземпляр программы и показать пользователю. На данный момент сделал только, чтоб 2-й экземпляр не запускался: http://stackoverflow.com/questions/19147/what-is-the-correct-way-to-create-a-single-instance-application Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Здесь я не увидел по поиску такого решения. У кого какие идеи? Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2015, 15:21 |
|
Запуск одного экземпляра программы WPF
|
|||
---|---|---|---|
#18+
Эм. Слишком тяжёлая задача? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2015, 16:04 |
|
Запуск одного экземпляра программы WPF
|
|||
---|---|---|---|
#18+
DomenER, Код: c# 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2015, 16:08 |
|
Запуск одного экземпляра программы WPF
|
|||
---|---|---|---|
#18+
Roman Mejtes, Данный вариант сработает у в уже запущенном одном приложении. А мы запускаем второй экземпляр и должны переключиться на 1-й и закрыть 2-й. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2015, 16:45 |
|
Запуск одного экземпляра программы WPF
|
|||
---|---|---|---|
#18+
DomenERRoman Mejtes, Данный вариант сработает у в уже запущенном одном приложении. А мы запускаем второй экземпляр и должны переключиться на 1-й и закрыть 2-й. http://codereview.stackexchange.com/questions/20871/single-instance-wpf-application вот в этом примере на сколько я могу видеть сделано открытие окна ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2015, 17:34 |
|
Запуск одного экземпляра программы WPF
|
|||
---|---|---|---|
#18+
Ещё 1 важный момент: Если сделать this.ShowInTaskbar = false; то SetForegroundWindow уже не срабатывает. И это одна из главных проблем! ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2015, 17:44 |
|
Запуск одного экземпляра программы WPF
|
|||
---|---|---|---|
#18+
DomenERЕщё 1 важный момент: Если сделать this.ShowInTaskbar = false; то SetForegroundWindow уже не срабатывает. И это одна из главных проблем! Вообще мне не очень понятно, нафига вся эта лапка кода, если конструктор мутекса имеет 3 параметр. bool который возвращает значение, существует ли в системе уже такой Mutex или нет. То есть можно создать Mutex, даже не надо захватывать его, затем проверить значение переменной, профит Код: c# 1. 2.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2015, 17:49 |
|
Запуск одного экземпляра программы WPF
|
|||
---|---|---|---|
#18+
Roman Mejtes, Вы по ссылке прочитайте вниз, там же написан пример, сделанный на базе уже существующих возможностей WPF, там и активация показана и как создать приложение, чтоб оно было одиночным. Я про это даже в книжках читал :) что в WPF уже всё из коробки есть ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2015, 17:52 |
|
Запуск одного экземпляра программы WPF
|
|||
---|---|---|---|
#18+
Нужно использовать не мьютексы и постинг сообщений в окна, а EventWaitHandle - он сам знает, кого оповестить, и как. Вот здесь это люди обсуждали: http://forum.ixbt.com/topic.cgi?id=26:41932 Ссылка с примером реализации в конце темы. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2015, 03:19 |
|
Запуск одного экземпляра программы WPF
|
|||
---|---|---|---|
#18+
хороший вариант предложен здесь: http://blogs.microsoft.co.il/arik/2010/05/28/wpf-single-instance-application/ только с маленькой доработкой процедуры в классе private static object ActivateFirstInstanceCallback(object arg) { // Get command line args to be passed to first instance IList<string> args = arg as IList<string>; ActivateFirstInstance(args); if (Application.Current.MainWindow.IsLoaded) //Проверка на загрузку окна { if (Application.Current.MainWindow.WindowState == WindowState.Minimized) //Проверка свёрнуто ли окно { Application.Current.MainWindow.WindowState = WindowState.Normal; // разворачиваем } Application.Current.MainWindow.Activate(); //активируем окно } return null; } ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 15:18 |
|
|
start [/forum/topic.php?fid=21&fpage=16&tid=1440826]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
50ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 260ms |
total: | 410ms |
0 / 0 |