есть первое приложение, которое может находится в развернутом состоянии на десктопе, а может находится в трее.
Мне нужно второе приложение, которое будет проверять если есть первое приложение в трее , то вызвать его на десктоп.
Пытаюсь это делать так
::ShowWindow(hwnd, SW_SHOWNORMAL);
BOOL res = ::BringWindowToTop(hwnd);
return ::SetForegroundWindow(hwnd) || res;
Но это несовсем корректно. Первое приложение выходит из трея и раворачивается на десктопе, но в трее оно еще присутствует и вызывается некорректно — некоторые процессы для десктопа не запускаются, т.е
на десктопе сидит, но его состояние, как для трея. И еще, минимизация окна заблокирована.
Здравствуйте, Vicul, Вы писали:
V>Как сделать корректно?
1. Завести именованный мьютекс в первом приложении. Во втором приложении проверять его наличие и если он есть то (2).
2. Послать Windows message приложению 1 из приложения 2. Соответственно, приложение 1 должно обрабатывать это сообщение и развернуться.
Здравствуйте, Kernan, Вы писали:
K>Здравствуйте, Vicul, Вы писали:
V>>Как сделать корректно? K>1. Завести именованный мьютекс в первом приложении. Во втором приложении проверять его наличие и если он есть то (2). K>2. Послать Windows message приложению 1 из приложения 2. Соответственно, приложение 1 должно обрабатывать это сообщение и развернуться.
Спасибо, так и сделал. Правда обошелся без мютекса, сделал через перечисления процессов.
Здравствуйте, Pavel Dvorkin, Вы писали:
V>>Спасибо, так и сделал. Правда обошелся без мютекса, сделал через перечисления процессов.
PD>Это не 100% корректно. Перечисление процессов неатомарно. Пока перечисляешь, он может и закончиться.
а можно пример 100% алгиритма? а то вариант тов. Kernan так же получается не на 100% корректен.
U>а можно пример 100% алгиритма? а то вариант тов. Kernan так же получается не на 100% корректен.
Ответ с мютексом лучше. Дело в том, что проверка существования мютекса атомарна, а перечисление процессов нет. Более того, перечисление идет по снимку (ToolHelp32), а снимок может уже не соответствовать действительности.
Проверка же существования объекта ядра атомарна.
Здравствуйте, Pavel Dvorkin, Вы писали:
U>>а можно пример 100% алгиритма? а то вариант тов. Kernan так же получается не на 100% корректен.
PD>Ответ с мютексом лучше. Дело в том, что проверка существования мютекса атомарна, а перечисление процессов нет. Более того, перечисление идет по снимку (ToolHelp32), а снимок может уже не соответствовать действительности. PD>Проверка же существования объекта ядра атомарна.
ну хорошо, проверил он мютекс, нашёл, посылает сообщение, а процесса уже нет,
в чём разница? в меньшей процентной вероятности попасть в момент закрытия процесса?
U>ну хорошо, проверил он мютекс, нашёл, посылает сообщение, а процесса уже нет, U>в чём разница? в меньшей процентной вероятности попасть в момент закрытия процесса?
U>>>а можно пример 100% алгиритма? а то вариант тов. Kernan так же получается не на 100% корректен. PD>>Ответ с мютексом лучше. Дело в том, что проверка существования мютекса атомарна, а перечисление процессов нет. Более того, перечисление идет по снимку (ToolHelp32), а снимок может уже не соответствовать действительности. PD>>Проверка же существования объекта ядра атомарна. U>ну хорошо, проверил он мютекс, нашёл, посылает сообщение, а процесса уже нет,
Мутекс не проверяют, а захватывают. Удалось захватить — создавай окно. Не удалось — ищи существующее окно и посылай ему сообщение. Удалось послать сообщение получив 'подтверждение" — выходи. Не удалось — освобождай мутекс и переходи на начало.
U>в чём разница? в меньшей процентной вероятности попасть в момент закрытия процесса?
Вероятность того что будет случайно запущено две копии по вышепреведенному алгоритму нулевая, а по алгоритму "найди процесс, если нашел — помаши ему ручкой" — ненулевая.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
O>Мутекс не проверяют, а захватывают.
его можно и проверять, его можно и захватывать.
O> Удалось захватить — создавай окно. Не удалось — ищи существующее окно и посылай ему сообщение. Удалось послать сообщение получив 'подтверждение" — выходи. Не удалось — освобождай мутекс и переходи на начало. U>>в чём разница? в меньшей процентной вероятности попасть в момент закрытия процесса? O>Вероятность того что будет случайно запущено две копии по вышепреведенному алгоритму нулевая, а по алгоритму "найди процесс, если нашел — помаши ему ручкой" — ненулевая.
вы для начала суть задачи прочитайте в первом сообщении, всё и так запущено, нужно просто вызвать.
O>>Мутекс не проверяют, а захватывают. U>его можно и проверять, его можно и захватывать.
Если проверять — то вероятность неправильного поведения будет ненулевая. Софт в логике которого изначально заложена вероятность неверного поведения, (но при этом легко можно было бы сделать правильно) — говнософт.
O>> Удалось захватить — создавай окно. Не удалось — ищи существующее окно и посылай ему сообщение. Удалось послать сообщение получив 'подтверждение" — выходи. Не удалось — освобождай мутекс и переходи на начало. U>>>в чём разница? в меньшей процентной вероятности попасть в момент закрытия процесса? O>>Вероятность того что будет случайно запущено две копии по вышепреведенному алгоритму нулевая, а по алгоритму "найди процесс, если нашел — помаши ему ручкой" — ненулевая.
U>вы для начала суть задачи прочитайте в первом сообщении, всё и так запущено, нужно просто вызвать.
Вот и вы прочитайте еще разок:
проверять если есть первое приложение в трее , то вызвать его на десктоп
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
O>>>Вероятность того что будет случайно запущено две копии по вышепреведенному алгоритму нулевая, а по алгоритму "найди процесс, если нашел — помаши ему ручкой" — ненулевая.
U>>вы для начала суть задачи прочитайте в первом сообщении, всё и так запущено, нужно просто вызвать. O>Вот и вы прочитайте еще разок: O>
O>проверять если есть первое приложение в трее , то вызвать его на десктоп
O>>>>Вероятность того что будет случайно запущено две копии по вышепреведенному алгоритму нулевая, а по алгоритму "найди процесс, если нашел — помаши ему ручкой" — ненулевая. U>>>вы для начала суть задачи прочитайте в первом сообщении, всё и так запущено, нужно просто вызвать. O>>Вот и вы прочитайте еще разок: O>>
O>>проверять если есть первое приложение в трее , то вызвать его на десктоп
GIV>какое из слов цитаты значит "запустить"?
Ну ок.. Никого уговаривать не буду, ваш код — ваши проблемы..
Как много веселых ребят, и все делают велосипед...