Вызвать приложение из Windows Tray
От: Vicul  
Дата: 07.04.16 13:38
Оценка:
Все привет,

есть первое приложение, которое может находится в развернутом состоянии на десктопе, а может находится в трее.

Мне нужно второе приложение, которое будет проверять если есть первое приложение в трее , то вызвать его на десктоп.

Пытаюсь это делать так
        ::ShowWindow(hwnd, SW_SHOWNORMAL);
        BOOL res = ::BringWindowToTop(hwnd);
        return  ::SetForegroundWindow(hwnd) || res;


Но это несовсем корректно. Первое приложение выходит из трея и раворачивается на десктопе, но в трее оно еще присутствует и вызывается некорректно — некоторые процессы для десктопа не запускаются, т.е
на десктопе сидит, но его состояние, как для трея. И еще, минимизация окна заблокирована.

Как сделать корректно?
Re: Вызвать приложение из Windows Tray
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 08.04.16 06:05
Оценка: 3 (1)
Здравствуйте, Vicul, Вы писали:

V>Как сделать корректно?

1. Завести именованный мьютекс в первом приложении. Во втором приложении проверять его наличие и если он есть то (2).
2. Послать Windows message приложению 1 из приложения 2. Соответственно, приложение 1 должно обрабатывать это сообщение и развернуться.
Sic luceat lux!
Отредактировано 08.04.2016 6:15 Kernan . Предыдущая версия .
Re[2]: Вызвать приложение из Windows Tray
От: Vicul  
Дата: 09.04.16 02:55
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Здравствуйте, Vicul, Вы писали:


V>>Как сделать корректно?

K>1. Завести именованный мьютекс в первом приложении. Во втором приложении проверять его наличие и если он есть то (2).
K>2. Послать Windows message приложению 1 из приложения 2. Соответственно, приложение 1 должно обрабатывать это сообщение и развернуться.

Спасибо, так и сделал. Правда обошелся без мютекса, сделал через перечисления процессов.
Re[3]: Вызвать приложение из Windows Tray
От: Pavel Dvorkin Россия  
Дата: 10.04.16 11:38
Оценка:
Здравствуйте, Vicul, Вы писали:

V>Спасибо, так и сделал. Правда обошелся без мютекса, сделал через перечисления процессов.


Это не 100% корректно. Перечисление процессов неатомарно. Пока перечисляешь, он может и закончиться.
With best regards
Pavel Dvorkin
Re[4]: Вызвать приложение из Windows Tray
От: uuuser  
Дата: 10.04.16 20:42
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

V>>Спасибо, так и сделал. Правда обошелся без мютекса, сделал через перечисления процессов.


PD>Это не 100% корректно. Перечисление процессов неатомарно. Пока перечисляешь, он может и закончиться.


а можно пример 100% алгиритма? а то вариант тов. Kernan так же получается не на 100% корректен.
Re[5]: Вызвать приложение из Windows Tray
От: Pavel Dvorkin Россия  
Дата: 11.04.16 03:19
Оценка: +1
Здравствуйте, uuuser, Вы писали:


U>а можно пример 100% алгиритма? а то вариант тов. Kernan так же получается не на 100% корректен.


Ответ с мютексом лучше. Дело в том, что проверка существования мютекса атомарна, а перечисление процессов нет. Более того, перечисление идет по снимку (ToolHelp32), а снимок может уже не соответствовать действительности.
Проверка же существования объекта ядра атомарна.
With best regards
Pavel Dvorkin
Re[6]: Вызвать приложение из Windows Tray
От: uuuser  
Дата: 11.04.16 22:06
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

U>>а можно пример 100% алгиритма? а то вариант тов. Kernan так же получается не на 100% корректен.


PD>Ответ с мютексом лучше. Дело в том, что проверка существования мютекса атомарна, а перечисление процессов нет. Более того, перечисление идет по снимку (ToolHelp32), а снимок может уже не соответствовать действительности.

PD>Проверка же существования объекта ядра атомарна.

ну хорошо, проверил он мютекс, нашёл, посылает сообщение, а процесса уже нет,
в чём разница? в меньшей процентной вероятности попасть в момент закрытия процесса?
Re[7]: Вызвать приложение из Windows Tray
От: Pavel Dvorkin Россия  
Дата: 12.04.16 01:44
Оценка:
Здравствуйте, uuuser, Вы писали:


U>ну хорошо, проверил он мютекс, нашёл, посылает сообщение, а процесса уже нет,

U>в чём разница? в меньшей процентной вероятности попасть в момент закрытия процесса?

Да.
With best regards
Pavel Dvorkin
Re[7]: Вызвать приложение из Windows Tray
От: ononim  
Дата: 12.04.16 14:21
Оценка:
U>>>а можно пример 100% алгиритма? а то вариант тов. Kernan так же получается не на 100% корректен.
PD>>Ответ с мютексом лучше. Дело в том, что проверка существования мютекса атомарна, а перечисление процессов нет. Более того, перечисление идет по снимку (ToolHelp32), а снимок может уже не соответствовать действительности.
PD>>Проверка же существования объекта ядра атомарна.
U>ну хорошо, проверил он мютекс, нашёл, посылает сообщение, а процесса уже нет,
Мутекс не проверяют, а захватывают. Удалось захватить — создавай окно. Не удалось — ищи существующее окно и посылай ему сообщение. Удалось послать сообщение получив 'подтверждение" — выходи. Не удалось — освобождай мутекс и переходи на начало.

U>в чём разница? в меньшей процентной вероятности попасть в момент закрытия процесса?

Вероятность того что будет случайно запущено две копии по вышепреведенному алгоритму нулевая, а по алгоритму "найди процесс, если нашел — помаши ему ручкой" — ненулевая.
Как много веселых ребят, и все делают велосипед...
Отредактировано 12.04.2016 22:53 ononim . Предыдущая версия . Еще …
Отредактировано 12.04.2016 14:22 ononim . Предыдущая версия .
Re[8]: Вызвать приложение из Windows Tray
От: uuuser  
Дата: 12.04.16 22:55
Оценка:
Здравствуйте, ononim, Вы писали:

O>Мутекс не проверяют, а захватывают.


его можно и проверять, его можно и захватывать.

O> Удалось захватить — создавай окно. Не удалось — ищи существующее окно и посылай ему сообщение. Удалось послать сообщение получив 'подтверждение" — выходи. Не удалось — освобождай мутекс и переходи на начало.

U>>в чём разница? в меньшей процентной вероятности попасть в момент закрытия процесса?
O>Вероятность того что будет случайно запущено две копии по вышепреведенному алгоритму нулевая, а по алгоритму "найди процесс, если нашел — помаши ему ручкой" — ненулевая.

вы для начала суть задачи прочитайте в первом сообщении, всё и так запущено, нужно просто вызвать.
Re[9]: Вызвать приложение из Windows Tray
От: ononim  
Дата: 13.04.16 09:26
Оценка:
O>>Мутекс не проверяют, а захватывают.
U>его можно и проверять, его можно и захватывать.
Если проверять — то вероятность неправильного поведения будет ненулевая. Софт в логике которого изначально заложена вероятность неверного поведения, (но при этом легко можно было бы сделать правильно) — говнософт.

O>> Удалось захватить — создавай окно. Не удалось — ищи существующее окно и посылай ему сообщение. Удалось послать сообщение получив 'подтверждение" — выходи. Не удалось — освобождай мутекс и переходи на начало.

U>>>в чём разница? в меньшей процентной вероятности попасть в момент закрытия процесса?
O>>Вероятность того что будет случайно запущено две копии по вышепреведенному алгоритму нулевая, а по алгоритму "найди процесс, если нашел — помаши ему ручкой" — ненулевая.

U>вы для начала суть задачи прочитайте в первом сообщении, всё и так запущено, нужно просто вызвать.

Вот и вы прочитайте еще разок:

проверять если есть первое приложение в трее , то вызвать его на десктоп

Как много веселых ребят, и все делают велосипед...
Отредактировано 13.04.2016 9:31 ononim . Предыдущая версия . Еще …
Отредактировано 13.04.2016 9:30 ononim . Предыдущая версия .
Re[10]: Вызвать приложение из Windows Tray
От: GarryIV  
Дата: 13.04.16 09:51
Оценка:
Здравствуйте, ononim, Вы писали:

O>>>Вероятность того что будет случайно запущено две копии по вышепреведенному алгоритму нулевая, а по алгоритму "найди процесс, если нашел — помаши ему ручкой" — ненулевая.


U>>вы для начала суть задачи прочитайте в первом сообщении, всё и так запущено, нужно просто вызвать.

O>Вот и вы прочитайте еще разок:
O>

O>проверять если есть первое приложение в трее , то вызвать его на десктоп


какое из слов цитаты значит "запустить"?
WBR, Igor Evgrafov
Re[11]: Вызвать приложение из Windows Tray
От: ononim  
Дата: 13.04.16 10:16
Оценка:
O>>>>Вероятность того что будет случайно запущено две копии по вышепреведенному алгоритму нулевая, а по алгоритму "найди процесс, если нашел — помаши ему ручкой" — ненулевая.
U>>>вы для начала суть задачи прочитайте в первом сообщении, всё и так запущено, нужно просто вызвать.
O>>Вот и вы прочитайте еще разок:
O>>

O>>проверять если есть первое приложение в трее , то вызвать его на десктоп

GIV>какое из слов цитаты значит "запустить"?
Ну ок.. Никого уговаривать не буду, ваш код — ваши проблемы..
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.