Помогите. Handle.
Приложение2 - любое.
Как приложением1 определить открыто ли приложение2
(Handle - заранее неизвестен).
Воспользуйтесь функцией ShellExecute. Возвращаемое значение - instance handle запущенного приложения или код ошибки в случае неудачи. Подробности - в оперативной подсказке.
Цитата:
Originally posted by fellow
Воспользуйтесь функцией ShellExecute. Возвращаемое значение - instance handle запущенного приложения или код ошибки в случае неудачи. Подробности - в оперативной подсказке.
Воспользуйтесь функцией ShellExecute. Возвращаемое значение - instance handle запущенного приложения или код ошибки в случае неудачи. Подробности - в оперативной подсказке.
ShellExecute не подходит, потому что оно возвращает не настоящий Handle, а почти левое число.
Цитата:
Originally posted by Kadet
ShellExecute не подходит, потому что оно возвращает не настоящий Handle, а почти левое число.
ShellExecute не подходит, потому что оно возвращает не настоящий Handle, а почти левое число.
Не такое уж и левое. Цитата из MSDN:
Цитата:
Returns a value greater than 32 if successful, or an error value that is less than or equal to 32 otherwise. The following table lists the error values. The return value is cast as an HINSTANCE for backward compatibility with 16-bit Microsoft® Windows® applications. It is not a true HINSTANCE, however. The only thing that can be done with the returned HINSTANCE is to cast it to an integer and compare it with the value 32 or one of the error codes below.
Посему, для определения факта запуска приложения достаточно проверить возвращаемое значение на отсутствие ошибки.
Можно воспользоваться ShellExecuteEx, она возвращает BOOL.
Цитата:
Originally posted by fellow
Не такое уж и левое. Цитата из MSDN:
Посему, для определения факта запуска приложения достаточно проверить возвращаемое значение на отсутствие ошибки.
Можно воспользоваться ShellExecuteEx, она возвращает BOOL.
Не такое уж и левое. Цитата из MSDN:
Посему, для определения факта запуска приложения достаточно проверить возвращаемое значение на отсутствие ошибки.
Можно воспользоваться ShellExecuteEx, она возвращает BOOL.
Задача - определить завершило ли работу приложение2.
Если подскажешь операторы (а лучше кусочек кода) буду очень благодарен.
Цитата:
Originally posted by Kadet
Задача - определить завершило ли работу приложение2.
Если подскажешь операторы (а лучше кусочек кода) буду очень благодарен.
Задача - определить завершило ли работу приложение2.
Если подскажешь операторы (а лучше кусочек кода) буду очень благодарен.
Можно поюзать FindWindow(), параметры у нее - заголовк окна и имя его класса. Если такое окно есть, то возвращается хэндл окна, иначе - 0. Только надо знать соответствующие заголовок и имя класса искомого окна. Причем поиск ведется только по главным окнам приложений, дочерние - пропускаются.
Нашол.
FindExecutable
(Модуль ShellAPI)
HINSTANCE FindExecutable(
LPCTSTR lpFile,//строка с именем файла документа
LPCTSTR lpDirectory,//строка каталога по умолчанию
LPTSTR lpResult//строка с именем выполняемого файла
)
При успешном завершении возвращает значение > 32. Если меньше, то свидетельствует об ошибке.
Пример
char APchar[254];
FindExecutable("Doc.doc",NULL,APchar);
Label1->Caption=APchar;
Приведёт к тому, что в метку Label1 будет занесено имя приложения, связанного с файлом типа .doc.
Например:
C:\MSOFFICE\WINWORD\WINWORD.EXE
HWND GetNextWindow(hWnd,unsigned int wCmd);
Функция определяет дискриптор следующего или предыдущего окна. Параметр hWnd - дискриптор окна, от которого начинается отсчёт.
Параметр wCmd - определяет направление поиска. Если wCmd = GW_HWNDNEXT, то ищется следующее окно, находящееся ниже. Если wCmd = GW_HWNDPREV,
то ищется предыдущее окно, находящееся выше. Если результат выполнения функции = NULL, то в данном направлении больше окон нет.
Как мы узнаём, что процесс наш - по дискриптору (дискриптор процесса (кстати запустил через CreatProcess) и дискрипторы запущенных приложений.