Как вызвать приложение на передний план по имени exe-шника?
Находим по очереди процессы и с помощью функции
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
);
получаем имя екзешника (полный путь), сверяем его с именем проги и делаем соответствующие выводы.
Только вот если будет две проги с одинаковыми именами, то будет нехорошо :)
Вижу такое решение проблемы.
Находим по очереди процессы и с помощью функции
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 специально для этой цели придумали второй параметр. =)
Вижу такое решение проблемы.
Находим по очереди процессы и с помощью функции
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;
По-моему у WinExec специально для этой цели придумали второй параметр. =)
Да, параметров много хороших и разных, есть еще много "новых" и более замечательных функций, типа CreateProc... Но, хотелось бы, "забыть", что и когда запускалось, а искать hWnd главного окна по списку exe-шников, который только и храниться. Так уж построено всё это дело. Кардинально менять - нет времени.
Да, параметров много хороших и разных, есть еще много "новых" и более замечательных функций, типа CreateProc... Но, хотелось бы, "забыть", что и когда запускалось, а искать hWnd главного окна по списку exe-шников, который только и храниться. Так уж построено всё это дело. Кардинально менять - нет времени.
Ну по списку экзешников ты окно не вычислиш,придется использовать EnumWindows.
Да, параметров много хороших и разных, есть еще много "новых" и более замечательных функций, типа CreateProc... Но, хотелось бы, "забыть", что и когда запускалось, а искать hWnd главного окна по списку exe-шников, который только и храниться. Так уж построено всё это дело. Кардинально менять - нет времени.
Не берусь спорить, но по-моему переделывать то нечего чтоб работать с WinExec или еще лучше - ShellExecute. Я всегда только их и использую. Хотя хозяин - барин.
Всем спасибо.