Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как вызвать приложение на передний план по имени exe-шника?

9.9K
25 июля 2005 года
ISA
9 / / 13.05.2005
В системе (XP) имеется главное приложение (меню запуска) из которого запускаются другие программы, написанные разными разработчиками. Главное меню представляет форму, которая распахнута на весь экран. При запуске приложений возникают ситуации, когда запущенное приложение оказывается под формой меню - это "пугает" пользователей. Как вызвать приложение на передний план по имени exe-шника? Т.е. повторным нажатием соответствующего пункта в главном меню. Поиск по заголовку окна - здесь все понятно, но не приемлим, т.к. от запуска к запуску он меняется. А вот имя exe-ника - постоянно.
292
25 июля 2005 года
Matush
726 / / 14.01.2004
Вижу такое решение проблемы.
Находим по очереди процессы и с помощью функции
DWORD GetModuleFileNameEx(
HANDLE hProcess, // handle to the process
HMODULE hModule, // handle to the module
LPTSTR lpFilename, // buffer that receives the path
DWORD nSize // size of the buffer
);
получаем имя екзешника (полный путь), сверяем его с именем проги и делаем соответствующие выводы.

Только вот если будет две проги с одинаковыми именами, то будет нехорошо :)
255
25 июля 2005 года
Dart Bobr
1.4K / / 09.04.2004
Цитата:
Originally posted by Matush
Вижу такое решение проблемы.
Находим по очереди процессы и с помощью функции
DWORD GetModuleFileNameEx(
HANDLE hProcess, // handle to the process
HMODULE hModule, // handle to the module
LPTSTR lpFilename, // buffer that receives the path
DWORD nSize // size of the buffer
);
получаем имя екзешника (полный путь), сверяем его с именем проги и делаем соответствующие выводы.

Только вот если будет две проги с одинаковыми именами, то будет нехорошо :)


По-моему у WinExec специально для этой цели придумали второй параметр. =)

9.9K
26 июля 2005 года
ISA
9 / / 13.05.2005
Цитата:
Originally posted by Matush
Вижу такое решение проблемы.
Находим по очереди процессы и с помощью функции
DWORD GetModuleFileNameEx(
HANDLE hProcess, // handle to the process
HMODULE hModule, // handle to the module
LPTSTR lpFilename, // buffer that receives the path
DWORD nSize // size of the buffer
);
получаем имя екзешника (полный путь), сверяем его с именем проги и делаем соответствующие выводы.

Только вот если будет две проги с одинаковыми именами, то будет нехорошо :)



Согласен, на счет имени и необходимости делать выводы. Но как получить hWnd главного окна приложения, чтобы дальше пользовать - SetForegroundWindow(Wnd: hWnd)? Нахожу имя, идентификатор процесса с помощью:


    function TForm1.SE_Task(ExeFileName: string): integer;
    var
    ContinueLoop: BOOL;
    FSnapshotHandle: THandle;
    FProcessEntry32: TProcessEntry32;
    hProcess: THandle;
    begin

    result := 0;

    FSnapshotHandle:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    FProcessEntry32.dwSize:= Sizeof(FProcessEntry32);
    ContinueLoop:= Process32First(FSnapshotHandle, FProcessEntry32);

    while integer(ContinueLoop) <> 0 do
    begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
    UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
    UpperCase(ExeFileName))) then
    begin

    hProcess:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, FProcessEntry32.th32ProcessID);

    // ХОЧУ
    //SetForegroundWindow(???);

    CloseHandle(hProcess);

    end;

    ListBox1.Items.Add(FProcessEntry32.szExeFile);

    ContinueLoop:= Process32Next(FSnapshotHandle, FProcessEntry32);

    end;

    CloseHandle(FSnapshotHandle);
    end;
9.9K
26 июля 2005 года
ISA
9 / / 13.05.2005
Цитата:
Originally posted by Dart Bobr
По-моему у WinExec специально для этой цели придумали второй параметр. =)



Да, параметров много хороших и разных, есть еще много "новых" и более замечательных функций, типа CreateProc... Но, хотелось бы, "забыть", что и когда запускалось, а искать hWnd главного окна по списку exe-шников, который только и храниться. Так уж построено всё это дело. Кардинально менять - нет времени.

406
26 июля 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by ISA
Да, параметров много хороших и разных, есть еще много "новых" и более замечательных функций, типа CreateProc... Но, хотелось бы, "забыть", что и когда запускалось, а искать hWnd главного окна по списку exe-шников, который только и храниться. Так уж построено всё это дело. Кардинально менять - нет времени.


Ну по списку экзешников ты окно не вычислиш,придется использовать EnumWindows.

255
26 июля 2005 года
Dart Bobr
1.4K / / 09.04.2004
Цитата:
Originally posted by ISA
Да, параметров много хороших и разных, есть еще много "новых" и более замечательных функций, типа CreateProc... Но, хотелось бы, "забыть", что и когда запускалось, а искать hWnd главного окна по списку exe-шников, который только и храниться. Так уж построено всё это дело. Кардинально менять - нет времени.


Не берусь спорить, но по-моему переделывать то нечего чтоб работать с WinExec или еще лучше - ShellExecute. Я всегда только их и использую. Хотя хозяин - барин.

9.9K
27 июля 2005 года
ISA
9 / / 13.05.2005
Выкрутился. "Одарил" форму-менюху свойством - всегда внизу. Этого, в моей ситуации, оказалось достаточно.
Всем спасибо.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог