Как грамотно сделать, нужно чтобы приложение запускалось всего 1 раз, это я сделал при помощи Mutex. Но при попытке запустить больше 1 instance приложения нужно активировать на передний план запущенное приложение, как это можно сделать?
11.02.06 17:16: Перенесено модератором из '.NET' — TK
Re: Передать фокус приложению и выдвинуть на передний план.
Здравствуйте, ABCDEFG, Вы писали:
ABC>Как грамотно сделать, нужно чтобы приложение запускалось всего 1 раз, это я сделал при помощи Mutex. Но при попытке запустить больше 1 instance приложения нужно активировать на передний план запущенное приложение, как это можно сделать?
Я бы сделал через Remoting.
Re[2]: Передать фокус приложению и выдвинуть на передний пла
Здравствуйте, Lloyd, Вы писали:
ABC>>Как грамотно сделать, нужно чтобы приложение запускалось всего 1 раз, это я сделал при помощи Mutex. Но при попытке запустить больше 1 instance приложения нужно активировать на передний план запущенное приложение, как это можно сделать?
L>Я бы сделал через Remoting.
Дело в том, что если ты передашь команду на активацию уже запущенному приложению, ты не сможешь из того процесса поднять окно наверх. Прочитай MSDN на тему SetForegroundWindow, в последних версиях виндов (с 2000 кажется) оно не даст поднять левое окно неактивному процессу.
Чтобы получить желаемое, надо в активном процессе после определения того, что моя копия уже работает выполнить SetForegroundWindow. А передать Handle можно сотней разных способов.
[RSDN@Home 1.1 beta 2] Сейчас 14:46, слушаю Trevor Rabin — Boost Me
"Develop with pleasure!"
Re: Передать фокус приложению и выдвинуть на передний план.
Здравствуйте, ABCDEFG, Вы писали:
ABC>Как грамотно сделать, нужно чтобы приложение запускалось всего 1 раз, это я сделал при помощи Mutex. Но при попытке запустить больше 1 instance приложения нужно активировать на передний план запущенное приложение, как это можно сделать?
Отровенно говоря лучше этого вообще не делать. Ребята из МС долго боролись, чтобы назойливые окна не выскакивали сами собой. Но уж если очень хочется, то можно, например, сделать свое окно TopMost на некоторое время, или попытаться активизировать (передать фокус) окно приложения. В W2k и старше активизироваться может только окно активного приложения.
А вообще, это вопрос не по дотнету. Уверен, что в форуме по ВинАпи на него не раз давали ответ.
... << RSDN@Home 1.1 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Передать фокус приложению и выдвинуть на передний пла
Здравствуйте, orangy, Вы писали:
L>>Я бы сделал через Remoting. O>Дело в том, что если ты передашь команду на активацию уже запущенному приложению, ты не сможешь из того процесса поднять окно наверх. Прочитай MSDN на тему SetForegroundWindow, в последних версиях виндов (с 2000 кажется) оно не даст поднять левое окно неактивному процессу. O>Чтобы получить желаемое, надо в активном процессе после определения того, что моя копия уже работает выполнить SetForegroundWindow. А передать Handle можно сотней разных способов.
Я разве где-то предложил поднимать окно наверх из другого процесса?
Вызов по ремоутингу приходит в другой процесс и выполняться он будет в рамках другого процесса, так что твое замечание не в кассу.
Re: Передать фокус приложению и выдвинуть на передний план.
Здравствуйте, ABCDEFG, Вы писали:
ABC>Как грамотно сделать, нужно чтобы приложение запускалось всего 1 раз, это я сделал при помощи Mutex. Но при попытке запустить больше 1 instance приложения нужно активировать на передний план запущенное приложение, как это можно сделать?
Было уже:
// Bring to front
m_Form.TopMost = true;
m_Form.TopMost = false;
Люблю OSCилировать
Re[4]: Передать фокус приложению и выдвинуть на передний пла
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, orangy, Вы писали:
L>>>Я бы сделал через Remoting. O>>Дело в том, что если ты передашь команду на активацию уже запущенному приложению, ты не сможешь из того процесса поднять окно наверх. Прочитай MSDN на тему SetForegroundWindow, в последних версиях виндов (с 2000 кажется) оно не даст поднять левое окно неактивному процессу. O>>Чтобы получить желаемое, надо в активном процессе после определения того, что моя копия уже работает выполнить SetForegroundWindow. А передать Handle можно сотней разных способов.
L>Я разве где-то предложил поднимать окно наверх из другого процесса?
Я так понял, вообще-то ты был немногословен
L>Вызов по ремоутингу приходит в другой процесс и выполняться он будет в рамках другого процесса, так что твое замечание не в кассу.
Ну вот, о том и речь. Не путай другой процесс (другой который не тот, в котором окно, которое нужно поднять) и активный процесс (понятие активности см. MSDN). Если ты из стартующего процесса передашь по ремоутингу (или любым другим способом) уже работающему приложению (которое где-то внизу Z-order) команду на подъём, то оно так просто поднять себя наверх не сможет. Если ты наоборот, получишь (через ремоутинг или как-то иначе) хэндл окна уже работающего приложения и поднимешь его из запускающегося, то всё получится. Но мне кажется, что ремоутинг это слишком круто для такой простой задачи
[RSDN@Home 1.1 beta 2] Сейчас 15:33, слушаю Trevor Rabin — Boost Me
"Develop with pleasure!"
Re[2]: Передать фокус приложению и выдвинуть на передний пла
Насколько я понял, нужно найти handle окна приложения которое нужно выдвинуть и SetForegroundWindow сделать, но возникает проблемка FindWindow находит сразу handle того окна которое нужно закрыть (ClassWindow у гних ведь одинаковый). А через Remoting делать не хотелось бы.
Re: Передать фокус приложению и выдвинуть на передний план.
Здравствуйте, ABCDEFG, Вы писали:
ABC> Насколько я понял, нужно найти handle окна приложения которое нужно выдвинуть и SetForegroundWindow сделать, но возникает проблемка FindWindow находит сразу handle того окна которое нужно закрыть (ClassWindow у гних ведь одинаковый). А через Remoting делать не хотелось бы.
А что, других способов передачи данных уже не осталось? Да хоть в registry его складывай в виде DWORD... Хотя это и не модно
[RSDN@Home 1.1 beta 2] Сейчас 16:14, слушаю Trevor Rabin — Boost Me
"Develop with pleasure!"
Re[2]: Передать фокус приложению и выдвинуть на передний пла
Здравствуйте, ABCDEFG, Вы писали:
ABC> Я проверил, действительно SetForegroundWindow не поднимает окно если вызов из другого процесса, неужели остается только Remoting?
У меня вот так уже давно работает:
.......
......
bool createdNew;
System.Threading.Mutex mutex = new System.Threading.Mutex(false, "My mutex", out createdNew);
if (!createdNew)
{
//получаем имя нашего процесса (название файла без расширения '.exe')string processName = System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName;
processName = processName.Substring(0, processName.IndexOf(".exe"));
System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
//перебираем все процессы с искомым именемforeach(System.Diagnostics.Process process in System.Diagnostics.Process.GetProcessesByName(processName))
{
//текущий экземпляр нас не интересуетif (process.Id == currentProcess.Id)
continue;
//могут быть разные приложения с одинаковым именем
//исполняемого файла. Проверяем что-бы это был 'наш' файлif (process.MainModule.FileName != currentProcess.MainModule.FileName)
continue;
//Активизируем основное окно приложения
SetForegroundWindow(process.MainWindowHandle);
ShowWindow(process.MainWindowHandle, SW_MAXIMIZED);
return;
}
}
......
......
}
[System.Runtime.InteropServices.DllImport("User32.dll")]
static extern int SetForegroundWindow(IntPtr hWnd);
const int SW_MAXIMIZED = 3;
[System.Runtime.InteropServices.DllImport("User32.dll")]
static extern int ShowWindow(IntPtr hWnd, Int32 Mode);
Особых глюков не замечено
Вместо SW_MAXIMIZED можно использовать другие константы.
... << RSDN@Home 1.1 beta 2 >>
ICQ: 446240
Re[3]: Передать фокус приложению и выдвинуть на передний пла
Здравствуйте, Miem, Вы писали:
M>Здравствуйте, ABCDEFG, Вы писали:
ABC>> Я проверил, действительно SetForegroundWindow не поднимает окно если вызов из другого процесса, неужели остается только Remoting?
M>У меня вот так уже давно работает: M>
M>.......
M>......
M> bool createdNew;
M> System.Threading.Mutex mutex = new System.Threading.Mutex(false, "My mutex", out createdNew);
M> if (!createdNew)
M> {
M> //получаем имя нашего процесса (название файла без расширения '.exe')
M> string processName = System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName;
M> processName = processName.Substring(0, processName.IndexOf(".exe"));
M> System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
M> //перебираем все процессы с искомым именем
M> foreach(System.Diagnostics.Process process in System.Diagnostics.Process.GetProcessesByName(processName))
M> {
M> //текущий экземпляр нас не интересует
M> if (process.Id == currentProcess.Id)
M> continue;
M> //могут быть разные приложения с одинаковым именем
M> //исполняемого файла. Проверяем что-бы это был 'наш' файл
M> if (process.MainModule.FileName != currentProcess.MainModule.FileName)
M> continue;
M> //Активизируем основное окно приложения
M> SetForegroundWindow(process.MainWindowHandle);
M> ShowWindow(process.MainWindowHandle, SW_MAXIMIZED);
M> return;
M> }
M> }
M> ......
M> ......
M> }
M> [System.Runtime.InteropServices.DllImport("User32.dll")]
M> static extern int SetForegroundWindow(IntPtr hWnd);
M> const int SW_MAXIMIZED = 3;
M> [System.Runtime.InteropServices.DllImport("User32.dll")]
M> static extern int ShowWindow(IntPtr hWnd, Int32 Mode);
M>
M>Особых глюков не замечено M>Вместо SW_MAXIMIZED можно использовать другие константы.
А не подскажете как свое же окно активировать???(После драг дропа в ворд необходимо при навединии мыши на свое окно активиролвать его для следующих операций). Пытаюсь активировать — либо мигает в панели задач либо не рабоатет. Пробовал многими способами — одно и то же. SW_MAXIMIZED — активирует всё как надо — но раскрывать его не нужно, SW_NORMAL,SW_SHOW,SW_RESTORE — не работают — опять моргания...
Help me if you can!
Re[2]: Передать фокус приложению и выдвинуть на передний пла
Здравствуйте, VladD2, Вы писали:
VD>Ребята из МС долго боролись, чтобы назойливые окна не выскакивали сами собой.
Абсолютно точно. Филосовский тезис здесь — окна активирует юзер, а не программист. Бороться с этим тезисом можно, но нужно ли? Столько усилий было ухлопано для претворения его в жизнь...
<<Rule of Forum: После того, как вопрос задан... не поленитесь поставить отвечавшему оценку!>>
Re[2]: Передать фокус приложению и выдвинуть на передний пла
Здравствуйте, ABCDEFG, Вы писали:
ABC> Я проверил, действительно SetForegroundWindow не поднимает окно если вызов из другого процесса, неужели остается только Remoting?
Да какой, в ... ремоутинг. Как уже было сказано: "Уверен, что в форуме по ВинАпи на него не раз давали ответ". Всего то и стоит, что полазить в MSDN на тему SetForegroundWindow, AllowSetForegroundWindow, RIT. Активировать окно может процесс, окно которого само находится в фореграунде, плюс еще реестр, параметры таймаутов.