Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.09.09;
Скачать: [xml.tar.bz2];

Вниз

Изменить заголовок окна после ShellExecute   Найти похожие ветки 

 
LordOfSilence   (2002-07-19 13:02) [0]

Знатоки, подскажите, пожалуйста, как решить следующую задачку:
Запускаю из своей программы другое приложение, возможно много экземпляров. Делаю это с помощью ShellExecute. Необходимо после запуска внешней программы заменить, вернее, дополнить ее заголовок.
Не получается даже просто считать заголовок чужой программы.
Проблема, видимо, в том, что ShellExecute возвращает дескриптор приложения, а не окна. Делаю примерно следующее:

procedure AppExec( _Program, _CmdLine : string );
var
Inst_ : HINST;
Title_ : array [ 0..80 ] of char;
begin
Inst_ := ShellExecute( 0, "open", PChar( _Program ), PChar( _CmdLine ), nil, SW_SHOWNORMAL );
GetWindowText( Inst_, Title_, SizeOf( Title_ ) );
ShowMessage( Title_ );
end;

Вызов ShowMessage выдает пустую строку. Будьте любезны, выскажите свои мысли по этому поводу. Заранее благодарен.


 
Song   (2002-07-19 14:43) [1]

Inst_ это не тот дискриптор. Сделайте после ShellExecute() не большую паузу и найдите нужный дискриптор через GetForeGroundWindow или GetActiveWindow


 
LordOfSilence   (2002-07-19 15:00) [2]

Вся проблема в том, что запускаю я не классический "Блокнот",
который "пестрит" во всех примерах, а серьезный пакет, который может, вообще говоря, грузиться разное время в зависимости от объема уже им подгружаемых данных, "усталости" виндового кеша и прочей ерундистики, которую заранее не предугадаешь. Поэтому можно просто не попасть на нужный момент активности окна. К тому же цитирую:

The GetActiveWindow function retrieves the window handle to the active window associated with the thread that calls the function.

Как я понимаю, "эта функция получает дескриптор для активного
окна, ассоциированного с потоком, который вызывают эту функцию".
То есть с потоком моего приложения, а не того, которое я запускаю. Поправьте меня, если я заблуждаюсь.


 
Song   (2002-07-19 15:04) [3]

Я поэтому и написал толи foreground толи active. Одно из них Вам поможет точно.
Если не знаете времени сколько приложение будет грузиться тогда придётся сделать цикл, ожидающий его загрузку:
While FindWindow(...)=0 Do Application.ProcessMessages;


 
LordOfSilence   (2002-07-19 15:07) [4]

Спасибо, я попробую


 
LordOfSilence   (2002-07-19 15:30) [5]

Миша, вся загвоздка в том, что FindWindow требует заголовка окна,
а в запускаемой мною программе они могут быть разными в зависимости от ее режима запуска, к тому же, с другой стороны, может быть запущено несколько экземпляров этой проги с одним заголовком. Какой из них найдет этот поиск через FindWindow - не знаю. То есть мне
надо запустить программу, получить заголовок именно этого экземпляра, и добавить к нему строку, допустим "всем привет".


 
Song   (2002-07-19 15:40) [6]

Ok, тогда воспользуемся тем, что имя запущенного фала Вам будет известно (оно фигурирует в ShellExecute()).
Для этого мы воспользуемся недокументированной ф-ией GetWindowModuleFileName(), она вернёт нам имя файла ассоциированного с данным дискриптором, поэтому нам надо в цикле ждать до тех пор пока путь, вытащенный для текущего дискриптора GetForeGroundWindow не будет равен тому, файл которого мы запустили.
Ф-ию см. в MSDN, в Дельфи нет.


 
LordOfSilence   (2002-07-19 16:06) [7]

Миша, с функцией GetWindowModuleFileName все наоборот. На входе
она требует HWND (его я не знаю), а выдает мне имя файла (его я
знаю). Возвращает она, как резултат функции, число символов в
имени файла. Привожу пример из MSDN:

GetWindowModuleFileName Function

The GetWindowModuleFileName function retrieves the full path and file name of the module associated with the specified window handle.

Syntax

UINT GetWindowModuleFileName(

HWND hwnd,
LPTSTR lpszFileName,
UINT cchFileNameMax
);

Parameters

hwnd
[in] Handle to the window whose module file name will be retrieved. lpszFileName
[out] Pointer to a buffer that receives the path and file name. cchFileNameMax
[in] Specifies the maximum number of TCHAR that can be copied into the lpszFileName buffer.

Return Value

The return value is the total number of TCHAR copied into the buffer.


 
Song   (2002-07-19 16:12) [8]

Всё правильно, она возращает Вам имя файла от дискриптора HWND в приёмник lpszFileName.
Т.е. алгоритм такой:

Function CurrentFileName:String;
Begin
GetWindowFileName(GetForeGroundWindow,Result,MAX_PATH);
End;

...

ShellExecute(...,"temp.exe",...);
While CurrentFileName<>"temp.exe" Do pplication.ProcessMessages;
...

Конечно, это пишется не так с точки зрения синтаксиса, но теперь надеюсь идея понятна.




Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.09.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.007 c
6-27131
Fenix
2002-06-22 09:57
2002.09.09
ip или host


1-27108
VID
2002-08-28 21:48
2002.09.09
Выполнение функции в отдельном потоке


6-27135
asmer
2002-07-03 15:48
2002.09.09
Network


1-26943
aaasv
2002-08-28 17:50
2002.09.09
Отображение текста, считанного из Wordа, в команентах Delphi


3-26896
koks
2002-07-30 09:57
2002.09.09
RecNo, RecordCount после филтра.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский