|
|
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
Привет! Как предотвратить повторный запуск приложения - весьма освещенный вопрос. Что интересно во многих случаях люди просят активировать окно приложения, которое пытаются повторно запустить и практически ни разу на этот вопрос не отвечено, кроме случая, когда для предотвращения повторного запуска приложения использован метод FindWindow, но он же был отмечен как наименее подходящий для задачи, т.к. заголовок окна может меняться. Ну а теперь вопрос - как "поднять"(активировать) свернутое окно приложения чтоб не сообщать юзеру ошибку, если я использую семафор (или мутекс)? спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2008, 20:59 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
Дык все уже разжевано давно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2008, 22:38 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
Дык в том числе читал и там. Нету тама поднятия уже запущенного приложения. Есть тока каменты по поводу и все. Или я провтыкал? Тогда или покажите где там сабж или объясните в чем прикол! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 02:01 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
CTAC-KO...Ну а теперь вопрос - как "поднять"(активировать) свернутое окно приложения чтоб не сообщать юзеру ошибку, если я использую семафор (или мутекс)? Развернуть изнутри элементарно Код: plaintext MSDNBOOL ShowWindow(HWND hWnd, int nCmdShow) Parameters hWnd [in] Handle to the window. nCmdShow [in] Specifies how the window is to be shown. This parameter is ignored the first time an application calls ShowWindow, if the program that launched the application provides a STARTUPINFO structure. Otherwise, the first time ShowWindow is called, the value should be the value obtained by the WinMain function in its nCmdShow parameter. In subsequent calls, this parameter can be one of the following values. SW_FORCEMINIMIZE Windows 2000/XP: Minimizes a window, even if the thread that owns the window is hung. This flag should only be used when minimizing windows from a different thread. SW_HIDE Hides the window and activates another window. SW_MAXIMIZE Maximizes the specified window. SW_MINIMIZE Minimizes the specified window and activates the next top-level window in the Z order. SW_RESTORE Activates and displays the window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when restoring a minimized window. SW_SHOW Activates the window and displays it in its current size and position. SW_SHOWDEFAULT Sets the show state based on the SW_ value specified in the STARTUPINFO structure passed to the CreateProcess function by the program that started the application. SW_SHOWMAXIMIZED Activates the window and displays it as a maximized window. SW_SHOWMINIMIZED Activates the window and displays it as a minimized window. SW_SHOWMINNOACTIVE Displays the window as a minimized window. This value is similar to SW_SHOWMINIMIZED, except the window is not activated. SW_SHOWNA Displays the window in its current size and position. This value is similar to SW_SHOW, except the window is not activated. SW_SHOWNOACTIVATE Displays a window in its most recent size and position. This value is similar to SW_SHOWNORMAL, except the window is not actived. SW_SHOWNORMAL Activates and displays a window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when displaying the window for the first time. Return Value If the window was previously visible, the return value is nonzero. If the window was previously hidden, the return value is zero. SW_SHOWMAXIMIZED = 3 SW_SHOWNORMAL = 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 08:33 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
Спасибо. Я в принципе и так знаю что для поднятия проги из другой нужен hWnd и соотв. команда. Не в этом проблема. Проблема как раз именно в определении hWnd. Ну и в том что такого решения я пока не видел, а только просьбы об этом. Т.е. нужно от хендла мутекса или семафора перейти както, наверное, к ProcessID потом от него искать его же форточку и расчехлять. Получается что пока единственным осуществимым выходом является поиск окна по заголовку: найдем - развернем, а нет - и че тогда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 09:24 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
CTAC-KOСпасибо. Я в принципе и так знаю что для поднятия проги из другой нужен hWnd и соотв. команда. Не в этом проблема. Проблема как раз именно в определении hWnd. Ну и в том что такого решения я пока не видел, а только просьбы об этом. Т.е. нужно от хендла мутекса или семафора перейти както, наверное, к ProcessID потом от него искать его же форточку и расчехлять. Получается что пока единственным осуществимым выходом является поиск окна по заголовку: найдем - развернем, а нет - и че тогда? Мутексы и семафоры объекты ядра Windows. У них нет процесса-владельца, поэтому ProcessID по ним не узнать. Тут многое зависит от того как приложения изначально между собой связаны. Вполне возможно что одно другому может передать заранее свой HWND, можно думаю по ProcessID на HWND выйти. Как точно это сделать сходу не скажу, т.к. сам редко с таким сталкиваюсь, пиши что конкретно у тебя происходит, как процессы меж собой взаимосвязаны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 09:35 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
Да никак никакие процессы не связаны. Единственная задача - при попытке повторного запуска молча активировать окно уже запущенной программы. Все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 09:52 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
подумалось: одним из способов определения что прога уже запущена является создание залоченного файла и попытка его удалить/открыть и тп непозволительности. Можно при запуске создавать файл, но не лочить от чтения, в который сливать свой HWND, тогда при повторном запуске искать в том файле этот HWND и по нему расчехлять уже запущенное приложение. По-идее наиболее простой вариант решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 10:06 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
CTAC-KOДа никак никакие процессы не связаны. Единственная задача - при попытке повторного запуска молча активировать окно уже запущенной программы. Все. Если FindWindow() не подходит, то тогда надо копать сюда: 1. Найти процесс созданный из этого же EXE, для этого перебрать все процессы и получить полный путь к создавшему его EXE, в итоге получить ProcessID первого запущенного. Перебор процессов через API функцию CreateToolhelp32Snapshot() 2. По ProcessID получить HWND. Как это делается не знаю. Можно у Сишников в форуме поспрашивать, они WinAPI чаще используют. На фоксе писать это будет очень муторно, т.к. там куча структур используется. Второй вариант использовать именованные области памяти и хранить там HWND. Т.е. прога запускается, проверяет что если такая область памяти уже есть то считывает оттуда HWND, если нет то создает и записывает туда свое HWND. Этот вариант по моему на фоксе вообще не написать, только на Си писать и DLL/FLL делать. Есть исходник простенького класса на С++, который похожее делает. Могу поделится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 10:12 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
CTAC-KO Можно при запуске создавать файл, но не лочить от чтения, в который сливать свой HWND, тогда при повторном запуске искать в том файле этот HWND и по нему расчехлять уже запущенное приложение. По-идее наиболее простой вариант решения. Попробуй. Должно заработать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 10:16 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
Dima TВторой вариант использовать именованные области памяти и хранить там HWND. Т.е. прога запускается, проверяет что если такая область памяти уже есть то считывает оттуда HWND, если нет то создает и записывает туда свое HWND. Этот вариант по моему на фоксе вообще не написать, только на Си писать и DLL/FLL делать. Есть исходник простенького класса на С++, который похожее делает. Могу поделится.блин, только вот подумал о таком варианте (чтобы не файл), а как оказывается не все так просто. Думал это типа стандартное что-то, типа атома. В таком случае вариант с созданием файла - наилучший и самый простой по ходу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 10:21 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
как вариант - хранение hwnd (или чего угодно иного) в файле подкачки только вот не понял как в обычной памяти это сделать. файл подкачки обычно есть у всех, но может случиться и так, что он будет отключен... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 10:51 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
CTAC-KOкак вариант - хранение hwnd (или чего угодно иного) в файле подкачки только вот не понял как в обычной памяти это сделать. файл подкачки обычно есть у всех, но может случиться и так, что он будет отключен... Это тот самый мой второй вариант с именованной общей областью памяти. Если файл подкачки будет отключен, то думаю глюки будут не только в твоем софте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 10:58 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
CTAC-KOДык в том числе читал и там. Нету тама поднятия уже запущенного приложения. Есть тока каменты по поводу и все. Или я провтыкал? Тогда или покажите где там сабж или объясните в чем прикол! А в конце этой статьи дополнительные ссылки не смотрел? Как вывести приложение на передний план ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 12:22 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
ВладимирМА в конце этой статьи дополнительные ссылки не смотрел?конечно смотрел. В свою очередь позвольте спросить: а Вы читали что я тут писал и спрашивал? Я по семафору определяю есть ли приложение, а искать окно по Caption/Title - нехорошо, об этом сказано не раз на этом же форуме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 13:06 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
ВладимирМА в конце этой статьи дополнительные ссылки не смотрел?конечно смотрел. В свою очередь позвольте спросить: а Вы читали что я тут писал и спрашивал? Я по семафору определяю есть ли приложение, а искать окно по Caption/Title - нехорошо, об этом сказано не раз на этом же форуме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 13:10 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
сорри за дубль - зто не я... это фаерфокс чето намутил... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 13:11 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
CTAC-KO ВладимирМА в конце этой статьи дополнительные ссылки не смотрел?конечно смотрел. В свою очередь позвольте спросить: а Вы читали что я тут писал и спрашивал? Я по семафору определяю есть ли приложение, а искать окно по Caption/Title - нехорошо, об этом сказано не раз на этом же форуме. Вообще-то, Вы как-то выборочно читаете. Точнее, даже не пытаетесь адаптировать ИДЕИ под то, что Вам кажется более правильным. Либо Вам должны выложить "на блюдечке" готовое решение, либо "это не правильное решение". А самостоятельно-то думать собираетесь? Первая статья - создаешь таблицу-хранилище, которая содержит идентификаторы всех открытых процессов твоего приложения. В том числе, это может быть и HWND, если Вам так уж хочется. Или просто заголовок нужного окна. Трудно было мысленно "добавить" нужные поля к таблице? Вторая статья - активиация любого приложения по его заголовку. Если очень хочется, можно определить заголовок по HWND ранее сохраненного окна. Или же в качестве одного из реквизитов хранить этот заголовок. Динамически меняя значение заголовка в реквизите, если он реально изменился в приложении. Но, разумеется, можете выдумать и свой собственный способ. Только, прежде чем писать очередную "нетленку" подумайте, а это действительно надо? Вы действительно уверены, что Вам надо менять заголовок окна? Вы действительно уверены, что может быть одновременно запущено несколько приложений с одинаковым заголовком окна? Как правило, после уточнения, когда же это реально может понадобиться, оказывается, что это может понадобиться в одном случае из 100. И ради 1% так мучиться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 13:52 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
ВладимирМВообще-то, Вы как-то выборочно читаете. Точнее, даже не пытаетесь адаптировать ИДЕИ под то, что Вам кажется более правильным. Либо Вам должны выложить "на блюдечке" готовое решение, либо "это не правильное решение". А самостоятельно-то думать собираетесь? CTAC-KOподумалось: одним из способов определения что прога уже запущена является создание залоченного файла и попытка его удалить/открыть и тп непозволительности. Можно при запуске создавать файл, но не лочить от чтения, в который сливать свой HWND, тогда при повторном запуске искать в том файле этот HWND и по нему расчехлять уже запущенное приложение. По-идее наиболее простой вариант решения. CTAC-KOкак вариант - хранение hwnd (или чего угодно иного) в файле подкачки и еще как вариант - хранение hwnd в реестре. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 14:03 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
а непосредственно реализацией я сейчас и занят втч... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 14:05 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
Проблема в том, что Вы все время выдумываете "ходы", а простейшие решения считаете чем-то "не правильным". Точнее, вообще их не замечаете. Простейшее решение - открыть окно по его заголовку. Что надо для этого сделать: 1) Заголовок окна должен быть уникальным иначе есть риск открыть "не то" приложение 2) Необходимо иметь способ быстро определить заголовок нужного окна Как это реализовать? Создать таблицу-хранилище, где ключем для поиска будет набор уникальных идентификаторов нужного приложения, а искомым значением - заголовок окна. Дальше объяснять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 14:30 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
Да у меня все проще - у меня нет нескольких приложений, оно всего одно. Вообще способ с таблицей не подошел для меня в том плане, что я использую mysql как сервер и там трудности (для меня) насчет rlock(). Да создать таблицу можно, вставить данные и все такое, а вот залочить запись... Идея хорошая, но я ее сразу же отмел по причине что не знаю как там можно, если вообще можно, лочить запись, иначе бы такое уже б давно использовал, как раз с целью узнать кто в данный момент юзает прогу и тд и тп. Поэтому найпростейшим вариантом пока оказалось создавать файл с хэндлом окна локально. Я интересовался в целом, как поднять приложение не зная заранее хэндл окна и не используя поиск окошек по названию для избежания повторного запуска, а используя для этого мутекс или семафор, которые хранить хэндл окна не будут. Я думал что можно через мутекс или семафор выйти на создавшее их приложение и его активировать (развернуть), т.к. создает его, мутекс или семафор, то самое приложение, которое не надо больше 1 копии за раз запускать. То что есть другие варианты подхода к этому делу - это безусловно хорошо и интересно, но еще интереснее самому что-то сваять, свое, а по ходу научиться чему-то еще. Если ничего придумать не получается, то по крайней мере можно в большей мере изучить определенный вариант и понять почему именно так сделано, а не иначе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2008, 01:59 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
Хмм... Основная идея предложенного решения была подробно описана по ссылке. Необходимо иметь "нечто" (объект, процесс, блокировку) которое обладает следующими свойствами: 1. Формируется одним и только одним процессом. Не обязательно автоматически. Можно и вручную 2. Можно увидеть и проанализировать из других процессов 3. Автоматически (обязательно!) уничтожается при закрытии процесса его породившего Применительно к FoxPro и файлам DBF всем этим условиям удовлетворяет процесс ручной блокировки записи. Как следствие, именно на этом и построен алгоритм. Поищите в MySQL "нечто", что также удовлетворяет приведенным условиям. Это вовсе не обязательно должна быть блокировка. Это может быть некий объект или какой-либо другой процесс. Возможно, MySQL способен проанализировать реквизиты всех коннектов, а в строке подключения, как правило, можно вставить комментрий по которому идентифицировать нужное приложение. Реквизит соединения, разумеется, не называется "комментарием". Это просто реквизит, который не обязателен для заполнения и никак не влияет на собственно организацию соединения. Например, для MS SQL в качестве комментария в строке подключения можно использовать опции APP или WSID. Поищите аналогичные опции в строке подключения MySQL. Но это просто как один из возможных вариантов. Другой вариант. Вы можете использовать тот же объект Mutex или семафор, а в таблице MySQL хранить имя этих объектов. Разумеется с добавлением идентификатора компьютера, например, по SYS(0). Далее просто пытаетесь создать еще один объект Mutex по заданным реквизитам на том же компьютере. Если объект есть, то достаем из той же таблицы Caption главной формы и активизируем это окно. Все просто. Факт наличия объекта Mutex с определенным именем становится своеобразной "блокировкой". Можно придумать и другие варианты. Надо просто сделать "шаг в сторону" от стереотипных решений. Хотя и предложенные варианты довольно стереотипны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2008, 11:29 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
авторчто я использую mysql как сервер и там трудности (для меня) насчет rlock(). для MSSQL есть 2 способа 1. считаем при проверке логина master..sysprocesses 2. устанавливаем и считываем лог-ю блокировку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2008, 11:41 |
|
||
|
Как "поднять" свернутое окно приложения? Re: повторный запуск приложения
|
|||
|---|---|---|---|
|
#18+
ВладимирМХмм... Основная идея предложенного решения была подробно описана по ссылке. Необходимо иметь "нечто" (объект, процесс, блокировку) которое обладает следующими свойствами: 1. Формируется одним и только одним процессом. Не обязательно автоматически. Можно и вручную 2. Можно увидеть и проанализировать из других процессов 3. Автоматически (обязательно!) уничтожается при закрытии процесса его породившего ... Ему надо еще: 4. Вывести пользователю окно первого запущенного процесса при запуске второго. Остальное как я понял у него заработало. А тут проблема отсутствия какой либо связи между проверяющим процессом и процессом первого запущенного экземпляра. Все экземпляры проверяют объект блокировки, но этот объект никак не идентифицирует того какой экземпляр его создал/заблокировал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2008, 11:43 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=35428771&tid=1587534]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
83ms |
get topic data: |
13ms |
get forum data: |
4ms |
get page messages: |
85ms |
get tp. blocked users: |
2ms |
| others: | 239ms |
| total: | 465ms |

| 0 / 0 |
