![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запуск "скрытого" приложения [D5, D6, D7, Win95/98, Win2k, WinXP]
e-a-r-l © (2004-11-18 08:16:00)Уважаемые мастера!
Столкнулся с такой проблемой. Пытаюсь запустить приложение (например, калькулятор) так, чтобы после запуска его окно было скрытым:
var
ProcessInfoFld : TProcessInformation;
StInfo : TStartupInfo;
begin
FillChar(StInfo, sizeof(StInfo), #0);
StInfo.cb := sizeof(TStartupInfo);
StInfo.dwFlags := STARTF_USESHOWWINDOW;
StInfo.wShowWindow := SW_HIDE;
CreateProcess(
PChar('C:\WINDOWS\system32\calc.exe'),
nil,
nil,
nil,
false,
NORMAL_PRIORITY_CLASS,
nil,
nil,
StInfo,
ProcessInfoFld)
end;
и -- ни-фи-га! :( То есть приложение запускается, но окно остается видимым. Пробовал первым параметром CreateProcess() ставить nil, вторым -- PChar('C:\WINDOWS\system32\calc.exe') -- не помогает.
Что интересно, для DOS-овских задач (например, nc) код работает.
Для калькулятора прошел следующий пример, но он мне не нравится из-за sleep():
var
ProcessInfoFld : TProcessInformation;
StInfo : TStartupInfo;
begin
FillChar(StInfo, sizeof(StInfo), #0);
StInfo.cb := sizeof(TStartupInfo);
StInfo.dwFlags := STARTF_USESHOWWINDOW;
StInfo.wShowWindow := SW_HIDE;
if CreateProcess(
PChar('C:\WINDOWS\system32\calc.exe'),
nil,
nil,
nil,
false,
NORMAL_PRIORITY_CLASS,
nil,
nil,
StInfo,
ProcessInfoFld) then begin
sleep(1000);
ShowWindow( FindWindow(nil, PChar('Калькулятор')), SW_HIDE)
end
end;
Нельзя ли обойтись одним CreateProcess() с нужными параметрами?
Заранее благодарен.
Юпитер (2004-11-19 02:25:00) [1]запускаешь сплэшь форму которая все окна перекрывает (либо просто пустую форму которая по верх всех окон. либо Копия картинки экрана. но тоже форма по верх всех окон).
в сплэше пишешь 'Loading...'
затем пишешь цикл пока не..
пока размеры формы не изменятся повторять цикл
изменить размер на например 2- ширина 2 высота.
тоесть левый размер
конец цикла
после цикла посылаешь
sendmessage(этой проге,0,скрыть) // чтобы скрыть ее
затем закрываешь свой сплэшь .. готово
дело в том что при посылке сообщений программе которая
еще не запустилась они проподают в пустую.
а убедиться что программа полностью запустилась.
надо дождаться пока она нормальн о будет реагировать
на команды.
я это делаю путем проверки команды изменения ее размера.
есть и другие способы...
например самый крутой::: сканировать память
но для этого надо писать много :)
e-a-r-l (2004-11-18 13:20:00) [2]В этом случае окно калькулятора все равно "сморгнет" не экране :(((
Erik1 (2004-11-18 11:18:00) [3]Но без sleep можно, поскольку CreateProcess возвращает ProcessHandle то можно подождать создание очереди сообщений. А уж после сделать SW_HIDE.
Игорь Шевченко (2004-11-18 10:20:00) [4]
> Нельзя ли обойтись одним CreateProcess() с нужными параметрами?
В общем случае нельзя. Приложение само решает, использовать ли ему параметры видимости окна переданные в функцию CreateProcess или не использовать.